Encapsulate `OpenFileDialog`/`SaveFileDialog`

This commit is contained in:
YoshiRulz 2022-10-11 10:47:52 +10:00
parent 2db5235319
commit f1f0f1695c
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
30 changed files with 548 additions and 587 deletions

View File

@ -1,6 +1,7 @@
#nullable enable
using System;
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
@ -57,6 +58,85 @@ namespace BizHawk.Client.Common
EMsgBoxIcon? icon = null)
=> dialogParent.DialogController.ShowMessageBox3(owner: dialogParent, text: text, caption: caption, icon: icon);
/// <summary>Creates and shows a <c>System.Windows.Forms.OpenFileDialog</c> or equivalent with the receiver (<paramref name="dialogParent"/>) as its parent</summary>
/// <param name="discardCWDChange"><c>OpenFileDialog.RestoreDirectory</c> (isn't this useless when specifying <paramref name="initDir"/>? keeping it for backcompat)</param>
/// <param name="filter"><c>OpenFileDialog.Filter</c></param>
/// <param name="initDir"><c>OpenFileDialog.InitialDirectory</c>; initial browse location</param>
/// <param name="initFileName"><c>OpenFileDialog.FileName</c>; pre-selected file (overrides <paramref name="initDir"/>?)</param>
/// <returns>filename of selected file, or <see langword="null"/> iff cancelled</returns>
public static string? ShowFileOpenDialog(
this IDialogParent dialogParent,
string initDir,
bool discardCWDChange = false,
FilesystemFilterSet? filter = null,
string? initFileName = null)
=> dialogParent.ShowFileMultiOpenDialog(
discardCWDChange: discardCWDChange,
filterStr: filter?.ToString(),
initDir: initDir,
initFileName: initFileName)?[0];
/// <summary>Creates and shows a <c>System.Windows.Forms.OpenFileDialog</c> or equivalent with the receiver (<paramref name="dialogParent"/>) as its parent</summary>
/// <param name="filter"><c>OpenFileDialog.Filter</c></param>
/// <param name="filterIndex"><c>OpenFileDialog.FilterIndex</c>; initially selected entry in <paramref name="filter"/></param>
/// <param name="initDir"><c>OpenFileDialog.InitialDirectory</c>; initial browse location</param>
/// <param name="windowTitle"><c>OpenFileDialog.Title</c></param>
/// <returns>filename of selected file, or <see langword="null"/> iff cancelled</returns>
/// <remarks>only used from MainForm, but don't move it there</remarks>
public static string? ShowFileOpenDialog(
this IDialogParent dialogParent,
FilesystemFilterSet? filter,
ref int filterIndex,
string initDir,
string? windowTitle = null)
=> dialogParent.DialogController.ShowFileMultiOpenDialog(
dialogParent: dialogParent,
filterStr: filter?.ToString(),
filterIndex: ref filterIndex,
initDir: initDir,
windowTitle: windowTitle)?[0];
/// <summary>Creates and shows a <c>System.Windows.Forms.OpenFileDialog</c> or equivalent with the receiver (<paramref name="dialogParent"/>) as its parent</summary>
/// <param name="filterStr"><c>OpenFileDialog.Filter</c></param>
/// <param name="initDir"><c>OpenFileDialog.InitialDirectory</c>; initial browse location</param>
/// <param name="initFileName"><c>OpenFileDialog.FileName</c>; pre-selected file (overrides <paramref name="initDir"/>?)</param>
/// <returns>filename of selected file, or <see langword="null"/> iff cancelled</returns>
/// <remarks>only used from Lua, but don't move it there</remarks>
public static string? ShowFileOpenDialog(
this IDialogParent dialogParent,
string? filterStr,
string initDir,
string? initFileName = null)
=> dialogParent.ShowFileMultiOpenDialog(
filterStr: filterStr,
initDir: initDir,
initFileName: initFileName)?[0];
/// <summary>Creates and shows a <c>System.Windows.Forms.SaveFileDialog</c> or equivalent with the receiver (<paramref name="dialogParent"/>) as its parent</summary>
/// <param name="discardCWDChange"><c>SaveFileDialog.RestoreDirectory</c> (renamed for clarity without inverting value; isn't this useless when specifying <paramref name="initDir"/>? keeping it for backcompat)</param>
/// <param name="fileExt"><c>SaveFileDialog.DefaultExt</c>; used only when the user's chosen filename doesn't have an extension (omit leading '.')</param>
/// <param name="filter"><c>SaveFileDialog.Filter</c></param>
/// <param name="initDir"><c>SaveFileDialog.InitialDirectory</c>; initial browse location</param>
/// <param name="initFileName"><c>SaveFileDialog.FileName</c>; pre-selected file (overrides <paramref name="initDir"/>?)</param>
/// <param name="muteOverwriteWarning"><c>SaveFileDialog.OverwritePrompt</c> (renamed for clarity with inverted value)</param>
/// <returns>filename of selected destination, or <see langword="null"/> iff cancelled</returns>
public static string? ShowFileSaveDialog(
this IDialogParent dialogParent,
string initDir,
bool discardCWDChange = false,
string? fileExt = null,
FilesystemFilterSet? filter = null,
string? initFileName = null,
bool muteOverwriteWarning = false)
=> dialogParent.DialogController.ShowFileSaveDialog(
dialogParent: dialogParent,
discardCWDChange: discardCWDChange,
fileExt: fileExt,
filterStr: filter?.ToString(),
initDir: initDir,
initFileName: initFileName,
muteOverwriteWarning: muteOverwriteWarning);
/// <summary>
/// Creates and shows a <c>System.Windows.Forms.MessageBox</c> or equivalent without a parent, with the given <paramref name="text"/>,
/// and with the given <paramref name="caption"/> and <paramref name="icon"/> if they're specified.
@ -92,5 +172,48 @@ namespace BizHawk.Client.Common
string? caption = null,
EMsgBoxIcon? icon = null)
=> dialogController.ShowMessageBox3(owner: null, text: text, caption: caption, icon: icon);
/// <summary>Creates and shows a <c>System.Windows.Forms.OpenFileDialog</c> or equivalent with the receiver (<paramref name="dialogParent"/>) as its parent</summary>
/// <param name="discardCWDChange"><c>OpenFileDialog.RestoreDirectory</c> (renamed for clarity without inverting value; isn't this useless when specifying <paramref name="initDir"/>? keeping it for backcompat)</param>
/// <param name="filterStr"><c>OpenFileDialog.Filter</c> (call <c>ToString</c> on a <see cref="FilesystemFilter"/>/<see cref="FilesystemFilterSet"/>)</param>
/// <param name="initDir"><c>OpenFileDialog.InitialDirectory</c>; initial browse location</param>
/// <param name="initFileName"><c>OpenFileDialog.FileName</c>; pre-selected file (overrides <paramref name="initDir"/>?)</param>
/// <param name="maySelectMultiple"><c>OpenFileDialog.Multiselect</c></param>
/// <returns>filenames of selected files, or <see langword="null"/> iff cancelled</returns>
private static IReadOnlyList<string>? ShowFileMultiOpenDialog(
this IDialogParent dialogParent,
string? filterStr,
string initDir,
bool discardCWDChange = false,
string? initFileName = null,
bool maySelectMultiple = false)
{
var filterIndex = 1; // you'd think the default would be 0, but it's not
return dialogParent.DialogController.ShowFileMultiOpenDialog(
dialogParent: dialogParent,
discardCWDChange: discardCWDChange,
filterStr: filterStr,
filterIndex: ref filterIndex,
initDir: initDir,
initFileName: initFileName,
maySelectMultiple: maySelectMultiple);
}
/// <summary>Creates and shows a <c>System.Windows.Forms.OpenFileDialog</c> or equivalent with the receiver (<paramref name="dialogParent"/>) as its parent</summary>
/// <param name="discardCWDChange"><c>OpenFileDialog.RestoreDirectory</c> (isn't this useless when specifying <paramref name="initDir"/>? keeping it for backcompat)</param>
/// <param name="filter"><c>OpenFileDialog.Filter</c></param>
/// <param name="initDir"><c>OpenFileDialog.InitialDirectory</c>; initial browse location</param>
/// <returns>filenames of selected files, or <see langword="null"/> iff cancelled</returns>
public static IReadOnlyList<string>? ShowFileMultiOpenDialog(
this IDialogParent dialogParent,
string initDir,
bool discardCWDChange = false,
FilesystemFilterSet? filter = null)
=> dialogParent.ShowFileMultiOpenDialog(
discardCWDChange: discardCWDChange,
filterStr: filter?.ToString(),
initDir: initDir,
initFileName: null,
maySelectMultiple: true);
}
}

View File

@ -1,11 +1,51 @@
#nullable enable
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
public interface IDialogController
{
void AddOnScreenMessage(string message);
/// <summary>Creates and shows a <c>System.Windows.Forms.OpenFileDialog</c> or equivalent</summary>
/// <param name="dialogParent">parent window</param>
/// <param name="discardCWDChange"><c>OpenFileDialog.RestoreDirectory</c> (renamed for clarity without inverting value; isn't this useless when specifying <paramref name="initDir"/>? keeping it for backcompat)</param>
/// <param name="filterStr"><c>OpenFileDialog.Filter</c> (call <c>ToString</c> on a <see cref="FilesystemFilter"/>/<see cref="FilesystemFilterSet"/>)</param>
/// <param name="filterIndex"><c>OpenFileDialog.FilterIndex</c>; initially selected entry in <paramref name="filterStr"/></param>
/// <param name="initDir"><c>OpenFileDialog.InitialDirectory</c>; initial browse location</param>
/// <param name="initFileName"><c>OpenFileDialog.FileName</c>; pre-selected file (overrides <paramref name="initDir"/>?)</param>
/// <param name="maySelectMultiple"><c>OpenFileDialog.Multiselect</c></param>
/// <param name="windowTitle"><c>OpenFileDialog.Title</c></param>
/// <returns>filenames of selected files, or <see langword="null"/> iff cancelled</returns>
IReadOnlyList<string>? ShowFileMultiOpenDialog(
IDialogParent dialogParent,
string? filterStr,
ref int filterIndex,
string initDir,
bool discardCWDChange = false,
string? initFileName = null,
bool maySelectMultiple = false,
string? windowTitle = null);
/// <summary>Creates and shows a <c>System.Windows.Forms.SaveFileDialog</c> or equivalent</summary>
/// <param name="dialogParent">parent window</param>
/// <param name="discardCWDChange"><c>SaveFileDialog.RestoreDirectory</c> (renamed for clarity without inverting value; isn't this useless when specifying <paramref name="initDir"/>? keeping it for backcompat)</param>
/// <param name="fileExt"><c>SaveFileDialog.DefaultExt</c>; used only when the user's chosen filename doesn't have an extension (omit leading '.')</param>
/// <param name="filterStr"><c>SaveFileDialog.Filter</c> (call <c>ToString</c> on a <see cref="FilesystemFilter"/>/<see cref="FilesystemFilterSet"/>)</param>
/// <param name="initDir"><c>SaveFileDialog.InitialDirectory</c>; initial browse location</param>
/// <param name="initFileName"><c>SaveFileDialog.FileName</c>; pre-selected file (overrides <paramref name="initDir"/>?)</param>
/// <param name="muteOverwriteWarning"><c>SaveFileDialog.OverwritePrompt</c> (renamed for clarity with inverted value)</param>
/// <returns>filename of selected destination, or <see langword="null"/> iff cancelled</returns>
string? ShowFileSaveDialog(
IDialogParent dialogParent,
bool discardCWDChange,
string? fileExt,
string? filterStr,
string initDir,
string? initFileName,
bool muteOverwriteWarning);
/// <summary>
/// Creates and shows a <c>System.Windows.Forms.MessageBox</c> or equivalent with the given <paramref name="text"/>,
/// and with the given <paramref name="owner"/>, <paramref name="caption"/>, and <paramref name="icon"/> if they're specified.

View File

@ -37,18 +37,12 @@ namespace BizHawk.Client.EmuHawk
#if AVI_SUPPORT
public void Run()
{
var ofd = new OpenFileDialog
{
FileName = $"{_game.FilesystemSafeName()}.syncless.txt",
InitialDirectory = _config.PathEntries.AvAbsolutePath()
};
var result = this.ShowFileOpenDialog(
initDir: _config.PathEntries.AvAbsolutePath(),
initFileName: $"{_game.FilesystemSafeName()}.syncless.txt");
if (result is null) return;
if (ofd.ShowDialog() == DialogResult.Cancel)
{
return;
}
_mSynclessConfigFile = ofd.FileName;
_mSynclessConfigFile = result;
//---- this is pretty crappy:
var lines = File.ReadAllLines(_mSynclessConfigFile);
@ -120,15 +114,11 @@ namespace BizHawk.Client.EmuHawk
height = bmp.Height;
}
var sfd = new SaveFileDialog
{
FileName = Path.ChangeExtension(_mSynclessConfigFile, ".avi")
};
sfd.InitialDirectory = Path.GetDirectoryName(sfd.FileName);
if (sfd.ShowDialog() == DialogResult.Cancel)
{
return;
}
var initFileName = Path.ChangeExtension(_mSynclessConfigFile, ".avi");
var result = this.ShowFileSaveDialog(
initDir: Path.GetDirectoryName(initFileName)!,
initFileName: initFileName);
if (result is null) return;
using var avw = new AviWriter(this);
avw.SetAudioParameters(44100, 2, 16); // hacky
@ -136,7 +126,7 @@ namespace BizHawk.Client.EmuHawk
avw.SetVideoParameters(width, height);
var token = avw.AcquireVideoCodecToken(_config);
avw.SetVideoCodecToken(token);
avw.OpenFile(sfd.FileName);
avw.OpenFile(result);
foreach (var fi in _mFrameInfos)
{
using (var bb = new BitmapBuffer(fi.PngPath, new BitmapLoadOptions()))

View File

@ -237,17 +237,13 @@ namespace BizHawk.Client.EmuHawk
public static void SaveAsFile(this Bitmap bitmap, IGameInfo game, string suffix, string systemId, PathEntryCollection paths, IDialogParent parent)
{
using var sfd = new SaveFileDialog
{
FileName = $"{game.FilesystemSafeName()}-{suffix}",
InitialDirectory = paths.ScreenshotAbsolutePathFor(systemId),
Filter = FilesystemFilterSet.Screenshots.ToString(),
RestoreDirectory = true
};
if (parent.ShowDialogWithTempMute(sfd) != DialogResult.OK) return;
var file = new FileInfo(sfd.FileName);
var result = parent.ShowFileSaveDialog(
discardCWDChange: true,
filter: FilesystemFilterSet.Screenshots,
initDir: paths.ScreenshotAbsolutePathFor(systemId),
initFileName: $"{game.FilesystemSafeName()}-{suffix}");
if (result is null) return;
FileInfo file = new(result);
string extension = file.Extension.ToUpper();
ImageFormat i = extension switch
{

View File

@ -319,12 +319,12 @@ namespace BizHawk.Client.EmuHawk
var args = new LoadRomArgs();
var filter = RomLoader.RomFilter.ToString();
var filter = RomLoader.RomFilter;
if (oac.Result == AdvancedRomLoaderType.LibretroLaunchGame)
{
args.OpenAdvanced = new OpenAdvanced_Libretro();
filter = oac.SuggestedExtensionFilter;
filter = oac.SuggestedExtensionFilter!;
}
else if (oac.Result == AdvancedRomLoaderType.ClassicLaunchGame)
{
@ -333,31 +333,20 @@ namespace BizHawk.Client.EmuHawk
else if (oac.Result == AdvancedRomLoaderType.MameLaunchGame)
{
args.OpenAdvanced = new OpenAdvanced_MAME();
filter = MAMERomsFSFilterSet.ToString();
filter = MAMERomsFSFilterSet;
}
else
{
throw new InvalidOperationException("Automatic Alpha Sanitizer");
}
/*************************/
/* CLONE OF CODE FROM OpenRom (mostly) */
using var ofd = new OpenFileDialog
{
InitialDirectory = Config.PathEntries.RomAbsolutePath(Emulator.SystemId),
Filter = filter,
RestoreDirectory = false,
FilterIndex = _lastOpenRomFilter,
Title = "Open Advanced"
};
if (!this.ShowDialogWithTempMute(ofd).IsOk()) return;
var file = new FileInfo(ofd.FileName);
var result = this.ShowFileOpenDialog(
filter: filter,
filterIndex: ref _lastOpenRomFilter,
initDir: Config.PathEntries.RomAbsolutePath(Emulator.SystemId),
windowTitle: "Open Advanced");
if (result is null) return;
FileInfo file = new(result);
Config.PathEntries.LastRomPath = file.DirectoryName;
_lastOpenRomFilter = ofd.FilterIndex;
/*************************/
LoadRom(file.FullName, args);
}
@ -507,21 +496,11 @@ namespace BizHawk.Client.EmuHawk
private void ImportMovieMenuItem_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
InitialDirectory = Config.PathEntries.RomAbsolutePath(Emulator.SystemId),
Multiselect = true,
Filter = MovieImport.AvailableImporters.ToString(),
RestoreDirectory = false
};
if (this.ShowDialogWithTempMute(ofd).IsOk())
{
foreach (var fn in ofd.FileNames)
{
ProcessMovieImport(fn, false);
}
}
var result = this.ShowFileMultiOpenDialog(
discardCWDChange: false,
filter: MovieImport.AvailableImporters,
initDir: Config.PathEntries.RomAbsolutePath(Emulator.SystemId));
if (result is not null) foreach (var fn in result) ProcessMovieImport(fn, false);
}
private void SaveMovieMenuItem_Click(object sender, EventArgs e)
@ -631,17 +610,11 @@ namespace BizHawk.Client.EmuHawk
private void ScreenshotAsMenuItem_Click(object sender, EventArgs e)
{
var (dir, file) = $"{ScreenshotPrefix()}.{DateTime.Now:yyyy-MM-dd HH.mm.ss}.png".SplitPathToDirAndFile();
using var sfd = new SaveFileDialog
{
InitialDirectory = dir,
FileName = file,
Filter = ScreenshotsFSFilterSet.ToString(),
};
if (this.ShowDialogWithTempMute(sfd).IsOk())
{
TakeScreenshot(sfd.FileName);
}
var result = this.ShowFileSaveDialog(
filter: ScreenshotsFSFilterSet,
initDir: dir,
initFileName: file);
if (result is not null) TakeScreenshot(result);
}
private void ScreenshotClipboardMenuItem_Click(object sender, EventArgs e)
@ -1177,16 +1150,13 @@ namespace BizHawk.Client.EmuHawk
private void SaveConfigAsMenuItem_Click(object sender, EventArgs e)
{
var (dir, file) = _getConfigPath().SplitPathToDirAndFile();
using var sfd = new SaveFileDialog
var result = this.ShowFileSaveDialog(
filter: ConfigFileFSFilterSet,
initDir: dir,
initFileName: file);
if (result is not null)
{
InitialDirectory = dir,
FileName = file,
Filter = ConfigFileFSFilterString
};
if (this.ShowDialogWithTempMute(sfd).IsOk())
{
SaveConfig(sfd.FileName);
SaveConfig(result);
AddOnScreenMessage("Copied settings");
}
}
@ -1199,17 +1169,8 @@ namespace BizHawk.Client.EmuHawk
private void LoadConfigFromMenuItem_Click(object sender, EventArgs e)
{
var (dir, file) = _getConfigPath().SplitPathToDirAndFile();
using var ofd = new OpenFileDialog
{
InitialDirectory = dir,
FileName = file,
Filter = ConfigFileFSFilterString
};
if (this.ShowDialogWithTempMute(ofd).IsOk())
{
LoadConfigFile(ofd.FileName);
}
var result = this.ShowFileOpenDialog(filter: ConfigFileFSFilterSet, initDir: dir!, initFileName: file!);
if (result is not null) LoadConfigFile(result);
}
private void ToolsSubMenu_DropDownOpened(object sender, EventArgs e)
@ -1561,16 +1522,14 @@ namespace BizHawk.Client.EmuHawk
private void Ti83LoadTIFileMenuItem_Click(object sender, EventArgs e)
{
if (Emulator is not TI83 ti83) return;
using var ofd = new OpenFileDialog
{
Filter = TI83ProgramFilesFSFilterSet.ToString(),
InitialDirectory = Config.PathEntries.RomAbsolutePath(Emulator.SystemId),
RestoreDirectory = true
};
if (!ofd.ShowDialog().IsOk()) return;
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: TI83ProgramFilesFSFilterSet,
initDir: Config.PathEntries.RomAbsolutePath(Emulator.SystemId));
if (result is null) return;
try
{
ti83.LinkPort.SendFileToCalc(File.OpenRead(ofd.FileName), true);
ti83.LinkPort.SendFileToCalc(File.OpenRead(result), true);
}
catch (IOException ex)
{
@ -1578,7 +1537,7 @@ namespace BizHawk.Client.EmuHawk
$"Invalid file format. Reason: {ex.Message} \nForce transfer? This may cause the calculator to crash.";
if (this.ShowMessageBox3(owner: null, message, "Upload Failed", EMsgBoxIcon.Question) == true)
{
ti83.LinkPort.SendFileToCalc(File.OpenRead(ofd.FileName), false);
ti83.LinkPort.SendFileToCalc(File.OpenRead(result), false);
}
}
}
@ -2179,22 +2138,19 @@ namespace BizHawk.Client.EmuHawk
private void ZXSpectrumExportSnapshotMenuItemMenuItem_Click(object sender, EventArgs e)
{
using var zxSnapExpDialog = new SaveFileDialog
{
DefaultExt = "szx",
Filter = ZXStateFilesFSFilterSet.ToString(),
RestoreDirectory = true,
SupportMultiDottedExtensions = true,
Title = "EXPERIMENTAL - Export 3rd party snapshot formats"
};
try
{
if (zxSnapExpDialog.ShowDialog().IsOk())
var result = this.ShowFileSaveDialog(
discardCWDChange: true,
fileExt: "szx",
// SupportMultiDottedExtensions = true, // I think this should be enabled globally if we're going to do it --yoshi
filter: ZXStateFilesFSFilterSet,
initDir: Config.PathEntries.ToolsAbsolutePath());
if (result is not null)
{
var speccy = (ZXSpectrum)Emulator;
var snap = speccy.GetSZXSnapshot();
File.WriteAllBytes(zxSnapExpDialog.FileName, snap);
File.WriteAllBytes(result, snap);
}
}
catch (Exception)
@ -2489,7 +2445,7 @@ namespace BizHawk.Client.EmuHawk
{
if (MovieSession.Movie.IsActive())
{
using var form = new EditSubtitlesForm(this, MovieSession.Movie, MovieSession.ReadOnly);
using EditSubtitlesForm form = new(this, MovieSession.Movie, Config.PathEntries, readOnly: MovieSession.ReadOnly);
form.ShowDialog();
}
}

View File

@ -1609,29 +1609,24 @@ namespace BizHawk.Client.EmuHawk
public bool RunLibretroCoreChooser()
{
using var ofd = new OpenFileDialog();
if (Config.LibretroCore != null)
string initFileName = null;
string initDir;
if (Config.LibretroCore is not null)
{
(ofd.InitialDirectory, ofd.FileName) = Config.LibretroCore.SplitPathToDirAndFile();
(initDir, initFileName) = Config.LibretroCore.SplitPathToDirAndFile();
}
else
{
var initDir = Config.PathEntries.AbsolutePathForType(VSystemID.Raw.Libretro, "Cores");
initDir = Config.PathEntries.AbsolutePathForType(VSystemID.Raw.Libretro, "Cores");
Directory.CreateDirectory(initDir);
ofd.InitialDirectory = initDir;
}
ofd.RestoreDirectory = true;
ofd.Filter = LibretroCoresFSFilterSet.ToString();
if (ofd.ShowDialog() == DialogResult.Cancel)
{
return false;
}
Config.LibretroCore = ofd.FileName;
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: LibretroCoresFSFilterSet,
initDir: initDir!,
initFileName: initFileName);
if (result is null) return false;
Config.LibretroCore = result;
return true;
}
@ -2399,25 +2394,20 @@ namespace BizHawk.Client.EmuHawk
MainformMenu,
new object/*?*/[] { c });
public static readonly string ConfigFileFSFilterString = new FilesystemFilter("Config File", new[] { "ini" }).ToString();
public static readonly FilesystemFilterSet ConfigFileFSFilterSet = new(new FilesystemFilter("Config File", new[] { "ini" }))
{
AppendAllFilesEntry = false,
};
private void OpenRom()
{
using var ofd = new OpenFileDialog
{
InitialDirectory = Config.PathEntries.RomAbsolutePath(Emulator.SystemId),
Filter = RomLoader.RomFilter.ToString(),
RestoreDirectory = false,
FilterIndex = _lastOpenRomFilter
};
if (this.ShowDialogWithTempMute(ofd) != DialogResult.OK) return;
var file = new FileInfo(ofd.FileName);
_lastOpenRomFilter = ofd.FilterIndex;
var lra = new LoadRomArgs { OpenAdvanced = new OpenAdvanced_OpenRom { Path = file.FullName } };
LoadRom(file.FullName, lra);
var result = this.ShowFileOpenDialog(
filter: RomLoader.RomFilter,
filterIndex: ref _lastOpenRomFilter,
initDir: Config.PathEntries.RomAbsolutePath(Emulator.SystemId));
if (result is null) return;
var filePath = new FileInfo(result).FullName;
LoadRom(filePath, new LoadRomArgs { OpenAdvanced = new OpenAdvanced_OpenRom { Path = filePath } });
}
private void CoreSyncSettings(object sender, RomLoader.SettingsLoadArgs e)
@ -3422,20 +3412,16 @@ namespace BizHawk.Client.EmuHawk
}
else
{
using SaveFileDialog sfd = new()
{
FileName = $"{Game.FilesystemSafeName()}.{ext}",
Filter = new FilesystemFilterSet(new FilesystemFilter(ext, new[] { ext })).ToString(),
InitialDirectory = Config.PathEntries.AvAbsolutePath(),
};
if (this.ShowDialogWithTempMute(sfd) == DialogResult.Cancel)
var result = this.ShowFileSaveDialog(
filter: new(new FilesystemFilter(ext, new[] { ext })),
initDir: Config.PathEntries.AvAbsolutePath(),
initFileName: $"{Game.FilesystemSafeName()}.{ext}");
if (result is null)
{
aw.Dispose();
return;
}
pathForOpenFile = sfd.FileName;
pathForOpenFile = result;
}
aw.OpenFile(pathForOpenFile);
@ -4413,19 +4399,12 @@ namespace BizHawk.Client.EmuHawk
file.Directory.Create();
}
using var sfd = new SaveFileDialog
{
AddExtension = true,
DefaultExt = "State",
Filter = EmuHawkSaveStatesFSFilterSet.ToString(),
InitialDirectory = path,
FileName = $"{SaveStatePrefix()}.QuickSave0.State"
};
if (this.ShowDialogWithTempMute(sfd) == DialogResult.OK)
{
SaveState(sfd.FileName, sfd.FileName);
}
var result = this.ShowFileSaveDialog(
fileExt: "State",
filter: EmuHawkSaveStatesFSFilterSet,
initDir: path,
initFileName: $"{SaveStatePrefix()}.QuickSave0.State");
if (result is not null) SaveState(path: result, userFriendlyStateName: result);
if (Tools.IsLoaded<TAStudio>())
{
@ -4446,21 +4425,12 @@ namespace BizHawk.Client.EmuHawk
return;
}
using var ofd = new OpenFileDialog
{
InitialDirectory = Config.PathEntries.SaveStateAbsolutePath(Game.System),
Filter = EmuHawkSaveStatesFSFilterSet.ToString(),
RestoreDirectory = true
};
if (this.ShowDialogWithTempMute(ofd) != DialogResult.OK) return;
if (!File.Exists(ofd.FileName))
{
return;
}
LoadState(ofd.FileName, Path.GetFileName(ofd.FileName));
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: EmuHawkSaveStatesFSFilterSet,
initDir: Config.PathEntries.SaveStateAbsolutePath(Game.System));
if (result is null || !File.Exists(result)) return;
LoadState(result, Path.GetFileName(result));
}
private void SelectSlot(int slot)
@ -4662,6 +4632,53 @@ namespace BizHawk.Client.EmuHawk
public IDialogController DialogController => this;
public IReadOnlyList<string>/*?*/ ShowFileMultiOpenDialog(
IDialogParent dialogParent,
string/*?*/ filterStr,
ref int filterIndex,
string initDir,
bool discardCWDChange = false,
string/*?*/ initFileName = null,
bool maySelectMultiple = false,
string/*?*/ windowTitle = null)
{
using OpenFileDialog ofd = new()
{
FileName = initFileName ?? string.Empty,
Filter = filterStr ?? string.Empty,
FilterIndex = filterIndex,
InitialDirectory = initDir,
Multiselect = maySelectMultiple,
RestoreDirectory = discardCWDChange,
Title = windowTitle ?? string.Empty,
};
var result = dialogParent.ShowDialogWithTempMute(ofd);
filterIndex = ofd.FilterIndex;
return result.IsOk() && ofd.FileNames.Length is not 0 ? ofd.FileNames : null;
}
public string/*?*/ ShowFileSaveDialog(
IDialogParent dialogParent,
bool discardCWDChange,
string/*?*/ fileExt,
string/*?*/ filterStr,
string initDir,
string/*?*/ initFileName,
bool muteOverwriteWarning)
{
using SaveFileDialog sfd = new()
{
DefaultExt = fileExt ?? string.Empty,
FileName = initFileName ?? string.Empty,
Filter = filterStr ?? string.Empty,
InitialDirectory = initDir,
OverwritePrompt = !muteOverwriteWarning,
RestoreDirectory = discardCWDChange,
};
var result = dialogParent.ShowDialogWithTempMute(sfd);
return result.IsOk() ? sfd.FileName : null;
}
public void ShowMessageBox(
IDialogParent/*?*/ owner,
string text,

View File

@ -38,7 +38,7 @@ namespace BizHawk.Client.EmuHawk
public AdvancedRomLoaderType Result;
public string SuggestedExtensionFilter;
public FilesystemFilterSet SuggestedExtensionFilter = null;
public OpenAdvancedChooser(IDialogController dialogController, Config config, Func<CoreComm> createCoreComm, IGameInfo game, Func<bool> libretroCoreChooserCallback)
{
@ -113,7 +113,7 @@ namespace BizHawk.Client.EmuHawk
{
var entries = new List<FilesystemFilter> { new FilesystemFilter("ROMs", _currentDescription.ValidExtensions.Split('|')) };
if (!_currentDescription.NeedsArchives) entries.Add(FilesystemFilter.Archives); // "needs archives" means the relevant archive extensions are already in the list, and we shouldn't scan archives for roms
SuggestedExtensionFilter = new FilesystemFilterSet(entries.ToArray()).ToString();
SuggestedExtensionFilter = new(entries.ToArray());
Result = AdvancedRomLoaderType.LibretroLaunchGame;
DialogResult = DialogResult.OK;
Close();

View File

@ -268,15 +268,14 @@ namespace BizHawk.Client.EmuHawk
private void BtnSelectUserFilter_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
Filter = CgShaderPresetsFSFilterSet.ToString(),
FileName = _pathSelection
};
if (!this.ShowDialogAsChild(ofd).IsOk()) return;
var result = this.ShowFileOpenDialog(
filter: CgShaderPresetsFSFilterSet,
initDir: Path.GetDirectoryName(_pathSelection)!,
initFileName: _pathSelection);
if (result is null) return;
rbUser.Checked = true;
var choice = Path.GetFullPath(ofd.FileName);
var choice = Path.GetFullPath(result);
//test the preset
using (var stream = File.OpenRead(choice))

View File

@ -430,25 +430,24 @@ namespace BizHawk.Client.EmuHawk
private void TsmiSetCustomization_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
InitialDirectory = _currSelectorDir,
RestoreDirectory = true
};
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
initDir: _currSelectorDir);
if (result is null) return;
string firmwarePath = _pathEntries.FirmwareAbsolutePath();
if (!ofd.ShowDialog().IsOk()) return;
// remember the location we selected this firmware from, maybe there are others
_currSelectorDir = Path.GetDirectoryName(ofd.FileName);
_currSelectorDir = Path.GetDirectoryName(result);
try
{
using var hf = new HawkFile(ofd.FileName);
using HawkFile hf = new(result);
// for each selected item, set the user choice (even though multiple selection for this operation is no longer allowed)
foreach (ListViewItem lvi in lvFirmwares.SelectedItems)
{
var fr = (FirmwareRecord) lvi.Tag;
string filePath = ofd.FileName;
var filePath = result;
// if the selected file is an archive, allow the user to pick the inside file
// to always be copied to the global firmwares directory
@ -486,7 +485,7 @@ namespace BizHawk.Client.EmuHawk
{
var fi = new FileInfo(filePath);
filePath = Path.Combine(firmwarePath, fi.Name);
File.Copy(ofd.FileName, filePath);
File.Copy(result, filePath);
}
catch (Exception ex)
{
@ -582,13 +581,8 @@ namespace BizHawk.Client.EmuHawk
private void TbbImport_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog { Multiselect = true };
if (ofd.ShowDialog() != DialogResult.OK)
{
return;
}
RunImportJob(ofd.FileNames);
var result = this.ShowFileMultiOpenDialog(initDir: _pathEntries.FirmwareAbsolutePath());
if (result is not null) RunImportJob(result);
}
private bool RunImportJobSingle(string basePath, string f, ref string errors)

View File

@ -302,18 +302,11 @@ namespace BizHawk.Client.EmuHawk
private void Button6_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
InitialDirectory = _config.PathEntries.ScreenshotAbsolutePathFor(VSystemID.Raw.GB),
Filter = FilesystemFilterSet.Palettes.ToString(),
RestoreDirectory = true
};
var result = ofd.ShowDialog(this);
if (result.IsOk())
{
LoadColorFile(ofd.FileName, true);
}
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: FilesystemFilterSet.Palettes,
initDir: _config.PathEntries.ScreenshotAbsolutePathFor(VSystemID.Raw.GB));
if (result is not null) LoadColorFile(result, alert: true);
}
private void ColorChooserForm_DragDrop(object sender, DragEventArgs e)
@ -338,19 +331,12 @@ namespace BizHawk.Client.EmuHawk
private void Button7_Click(object sender, EventArgs e)
{
using var sfd = new SaveFileDialog
{
InitialDirectory = _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.GB),
FileName = $"{_game.Name}.pal",
Filter = FilesystemFilterSet.Palettes.ToString(),
RestoreDirectory = true
};
var result = sfd.ShowDialog(this);
if (result.IsOk())
{
SaveColorFile(sfd.FileName);
}
var result = this.ShowFileSaveDialog(
discardCWDChange: true,
filter: FilesystemFilterSet.Palettes,
initDir: _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.GB),
initFileName: $"{_game.Name}.pal");
if (result is not null) SaveColorFile(result);
}
private void DefaultButton_Click(object sender, EventArgs e)

View File

@ -264,18 +264,11 @@ namespace BizHawk.Client.EmuHawk
private void Button6_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
InitialDirectory = _config.PathEntries.ScreenshotAbsolutePathFor(VSystemID.Raw.GB),
Filter = FilesystemFilterSet.Palettes.ToString(),
RestoreDirectory = true
};
var result = ofd.ShowDialog(this);
if (result.IsOk())
{
LoadColorFile(ofd.FileName, true);
}
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: FilesystemFilterSet.Palettes,
initDir: _config.PathEntries.ScreenshotAbsolutePathFor(VSystemID.Raw.GB));
if (result is not null) LoadColorFile(result, alert: true);
}
private void ColorChooserForm_DragDrop(object sender, DragEventArgs e)
@ -300,19 +293,12 @@ namespace BizHawk.Client.EmuHawk
private void Button7_Click(object sender, EventArgs e)
{
using var sfd = new SaveFileDialog
{
InitialDirectory = _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.GB),
FileName = $"{_game.Name}.pal",
Filter = FilesystemFilterSet.Palettes.ToString(),
RestoreDirectory = true
};
var result = sfd.ShowDialog(this);
if (result.IsOk())
{
SaveColorFile(sfd.FileName);
}
var result = this.ShowFileSaveDialog(
discardCWDChange: true,
filter: FilesystemFilterSet.Palettes,
initDir: _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.GB),
initFileName: $"{_game.Name}.pal");
if (result is not null) SaveColorFile(result);
}
private void OK_Click(object sender, EventArgs e)

View File

@ -59,20 +59,12 @@ namespace BizHawk.Client.EmuHawk
private void BrowsePalette_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
InitialDirectory = _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.NES),
Filter = FilesystemFilterSet.Palettes.ToString(),
RestoreDirectory = true
};
var result = ofd.ShowDialog();
if (result != DialogResult.OK)
{
return;
}
PalettePath.Text = ofd.FileName;
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: FilesystemFilterSet.Palettes,
initDir: _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.NES));
if (result is null) return;
PalettePath.Text = result;
AutoLoadPalette.Checked = true;
SetPaletteImage();
}

View File

@ -83,20 +83,12 @@ namespace BizHawk.Client.EmuHawk
private void ButtonPal_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
InitialDirectory = _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.NES),
Filter = FilesystemFilterSet.Palettes.ToString(),
RestoreDirectory = true
};
var result = ofd.ShowDialog();
if (result != DialogResult.OK)
{
return;
}
var palette = new HawkFile(ofd.FileName);
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: FilesystemFilterSet.Palettes,
initDir: _config.PathEntries.PalettesAbsolutePathFor(VSystemID.Raw.NES));
if (result is null) return;
HawkFile palette = new(result);
if (palette.Exists)
{

View File

@ -32,9 +32,8 @@ namespace BizHawk.Client.EmuHawk.ForDebugging
SzTextBoxEx txtBaseFile = new() { Size = new(224, 23) };
void ShowBaseFilePicker()
{
using OpenFileDialog ofd = new() { InitialDirectory = Config!.PathEntries.FirmwareAbsolutePath() };
this.ShowDialogAsChild(ofd);
txtBaseFile.Text = ofd.FileName;
var filename = this.ShowFileSaveDialog(initDir: Config!.PathEntries.FirmwareAbsolutePath());
if (filename is not null) txtBaseFile.Text = filename;
}
CheckBoxEx cbDryRun = new() { Checked = true, Text = "dry run (skip writing to disk)" };
void DoPatch()

View File

@ -23,9 +23,8 @@ namespace BizHawk.Client.EmuHawk.ForDebugging
SzTextBoxEx txtBaseFile = new() { Size = new(224, 23) };
void ChooseBaseFile()
{
using OpenFileDialog ofd = new() { InitialDirectory = Config!.PathEntries.RomAbsolutePath() };
this.ShowDialogAsChild(ofd);
txtBaseFile.Text = ofd.FileName;
var filename = this.ShowFileOpenDialog(initDir: Config!.PathEntries.RomAbsolutePath());
if (filename is not null) txtBaseFile.Text = filename;
}
ComboBox comboFormats = new()
{
@ -36,19 +35,16 @@ namespace BizHawk.Client.EmuHawk.ForDebugging
SzTextBoxEx txtTargetFile = new() { Size = new(224, 23) };
void ChooseTargetFile()
{
using SaveFileDialog sfd = new()
{
DefaultExt = comboFormats.SelectedIndex switch
var filename = this.ShowFileSaveDialog(
fileExt: comboFormats.SelectedIndex switch
{
0 => "n64",
1 => "v64",
2 => "z64",
_ => string.Empty
_ => null
},
InitialDirectory = Config!.PathEntries.RomAbsolutePath(),
};
this.ShowDialogAsChild(sfd);
txtTargetFile.Text = sfd.FileName;
initDir: Config!.PathEntries.RomAbsolutePath());
if (filename is not null) txtTargetFile.Text = filename;
}
void DoConvert()
{

View File

@ -13,13 +13,16 @@ namespace BizHawk.Client.EmuHawk
{
private static readonly FilesystemFilterSet SubRipFilesFSFilterSet = new(new FilesystemFilter("SubRip Files", new[] { "srt" }));
private readonly PathEntryCollection _pathEntries;
private readonly IMovie _selectedMovie;
private readonly bool _readOnly;
public IDialogController DialogController { get; }
public EditSubtitlesForm(IDialogController dialogController, IMovie movie, bool readOnly)
public EditSubtitlesForm(IDialogController dialogController, IMovie movie, PathEntryCollection pathEntries, bool readOnly)
{
_pathEntries = pathEntries;
_selectedMovie = movie;
_readOnly = readOnly;
DialogController = dialogController;
@ -202,21 +205,10 @@ namespace BizHawk.Client.EmuHawk
private void Export_Click(object sender, EventArgs e)
{
// Get file to save as
using var form = new SaveFileDialog
{
AddExtension = true,
Filter = SubRipFilesFSFilterSet.ToString(),
};
var result = form.ShowDialog();
var fileName = form.FileName;
form.Dispose();
if (result != DialogResult.OK)
{
return;
}
var fileName = this.ShowFileSaveDialog(
filter: SubRipFilesFSFilterSet,
initDir: _pathEntries.MovieAbsolutePath());
if (fileName is null) return;
double fps;
try

View File

@ -501,26 +501,24 @@ namespace BizHawk.Client.EmuHawk
var indices = MovieView.SelectedIndices;
if (indices.Count > 0)
{
var s = new EditSubtitlesForm(DialogController, _movieList[MovieView.SelectedIndices[0]], true);
using EditSubtitlesForm s = new(DialogController, _movieList[MovieView.SelectedIndices[0]], _config.PathEntries, readOnly: true);
s.Show();
}
}
private void BrowseMovies_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
Filter = MoviesFSFilterSet.ToString(),
InitialDirectory = _config.PathEntries.MovieAbsolutePath()
};
if (!this.ShowDialogWithTempMute(ofd).IsOk()) return;
var file = new FileInfo(ofd.FileName);
var result = this.ShowFileOpenDialog(
filter: MoviesFSFilterSet,
initDir: _config.PathEntries.MovieAbsolutePath());
if (result is null) return;
FileInfo file = new(result);
if (!file.Exists)
{
return;
}
int? index = AddMovieToList(ofd.FileName, true);
int? index = AddMovieToList(result, true);
RefreshMovieList();
if (index.HasValue)
{

View File

@ -198,21 +198,13 @@ namespace BizHawk.Client.EmuHawk
}
var filterset = _movieSession.Movie.GetFSFilterSet();
using var sfd = new SaveFileDialog
{
InitialDirectory = movieFolderPath,
DefaultExt = $".{filterset.Filters[0].Extensions.First()}",
FileName = RecordBox.Text,
OverwritePrompt = false,
Filter = filterset.ToString(),
};
var result = this.ShowDialogWithTempMute(sfd);
if (result == DialogResult.OK
&& !string.IsNullOrWhiteSpace(sfd.FileName))
{
RecordBox.Text = sfd.FileName;
}
var result = this.ShowFileSaveDialog(
fileExt: $".{filterset.Filters[0].Extensions.First()}",
filter: filterset,
initDir: movieFolderPath,
initFileName: RecordBox.Text,
muteOverwriteWarning: true);
if (!string.IsNullOrWhiteSpace(result)) RecordBox.Text = result;
}
private void RecordMovie_Load(object sender, EventArgs e)

View File

@ -130,9 +130,9 @@ namespace BizHawk.Client.EmuHawk
DialogController.ShowMessageBox("No results to save!");
return;
}
using var sfd = new SaveFileDialog();
if (!sfd.ShowDialog(this).IsOk()) return;
using TextWriter tw = new StreamWriter(sfd.FileName);
var result = this.ShowFileSaveDialog(initDir: _config.PathEntries.ToolsAbsolutePath());
if (result is null) return;
using TextWriter tw = new StreamWriter(result);
foreach (var r in _mostRecentResults)
{
r.DumpTo(tw);

View File

@ -446,12 +446,10 @@ namespace BizHawk.Client.EmuHawk
this.ModalMessageBox("Cannot disassemble with no CDL loaded!", "Alert");
return;
}
using var sfd = new SaveFileDialog();
var result = sfd.ShowDialog(this);
if (result == DialogResult.OK)
var result = this.ShowFileSaveDialog(initDir: Config!.PathEntries.ToolsAbsolutePath());
if (result is not null)
{
using var fs = new FileStream(sfd.FileName, FileMode.Create, FileAccess.Write);
using var fs = new FileStream(result, FileMode.Create, FileAccess.Write);
CodeDataLogger.DisassembleCDL(fs, _cdl);
}
}

View File

@ -922,38 +922,24 @@ namespace BizHawk.Client.EmuHawk
}
private string GetBinarySaveFileFromUser()
{
using var sfd = new SaveFileDialog
{
Filter = (_domain.Name is ROM_DOMAIN_NAME
=> this.ShowFileSaveDialog(
discardCWDChange: true,
filter: _domain.Name is ROM_DOMAIN_NAME
? CreateBinaryDumpFSFilterSet(Path.GetExtension(RomName).RemovePrefix('.'))
: BinFilesFSFilterSet).ToString(),
RestoreDirectory = true,
InitialDirectory = RomDirectory,
FileName = _domain.Name is ROM_DOMAIN_NAME
: BinFilesFSFilterSet,
initDir: RomDirectory,
initFileName: _domain.Name is ROM_DOMAIN_NAME
? RomName
: Game.FilesystemSafeName(),
};
var result = this.ShowDialogWithTempMute(sfd);
return result == DialogResult.OK ? sfd.FileName : "";
}
: Game.FilesystemSafeName()) ?? string.Empty;
private string GetSaveFileFromUser()
{
using var sfd = new SaveFileDialog
{
FileName = _domain.Name is ROM_DOMAIN_NAME
=> this.ShowFileSaveDialog(
discardCWDChange: true,
filter: HexDumpsFSFilterSet,
initDir: RomDirectory,
initFileName: _domain.Name is ROM_DOMAIN_NAME
? $"{Path.GetFileNameWithoutExtension(RomName)}.txt"
: Game.FilesystemSafeName(),
Filter = HexDumpsFSFilterSet.ToString(),
InitialDirectory = RomDirectory,
RestoreDirectory = true
};
var result = this.ShowDialogWithTempMute(sfd);
return result == DialogResult.OK ? sfd.FileName : "";
}
: Game.FilesystemSafeName()) ?? string.Empty;
private void ResetScrollBar()
{
@ -1275,15 +1261,11 @@ namespace BizHawk.Client.EmuHawk
return;
}
using var sfd = new OpenFileDialog
{
Filter = ImportableFSFilterSet.ToString(),
RestoreDirectory = true
};
if (this.ShowDialogWithTempMute(sfd) != DialogResult.OK) return;
var path = sfd.FileName;
var path = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: ImportableFSFilterSet,
initDir: Config!.PathEntries.ToolsAbsolutePath());
if (path is null) return;
using var inf = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
long todo = Math.Min(inf.Length, _domain.Size);
@ -1318,19 +1300,14 @@ namespace BizHawk.Client.EmuHawk
private void LoadTableFileMenuItem_Click(object sender, EventArgs e)
{
string initialDirectory = Config.PathEntries.ToolsAbsolutePath();
var romName = Config.RecentRoms.MostRecent.SubstringAfterLast('|');
using var ofd = new OpenFileDialog
{
FileName = $"{Path.GetFileNameWithoutExtension(romName)}.tbl",
InitialDirectory = initialDirectory,
Filter = TextTablesFSFilterSet.ToString(),
RestoreDirectory = false
};
if (!this.ShowDialogWithTempMute(ofd).IsOk()) return;
LoadTable(ofd.FileName);
RecentTables.Add(ofd.FileName);
var result = this.ShowFileOpenDialog(
discardCWDChange: false,
filter: TextTablesFSFilterSet,
initDir: Config!.PathEntries.ToolsAbsolutePath(),
initFileName: $"{Path.GetFileNameWithoutExtension(Config.RecentRoms.MostRecent.SubstringAfterLast('|'))}.tbl");
if (result is null) return;
LoadTable(result);
RecentTables.Add(result);
GeneralUpdate();
}

View File

@ -7,6 +7,8 @@ using System.Linq;
using System.Windows.Forms;
using BizHawk.Client.Common;
using BizHawk.Common.PathExtensions;
using NLua;
namespace BizHawk.Client.EmuHawk
@ -386,19 +388,14 @@ namespace BizHawk.Client.EmuHawk
[LuaArbitraryStringParam] string initialDirectory = null,
[LuaASCIIStringParam] string filter = null)
{
var openFileDialog1 = new OpenFileDialog();
if (initialDirectory is not null) openFileDialog1.InitialDirectory = FixString(initialDirectory);
if (fileName is not null) openFileDialog1.FileName = FixString(fileName);
openFileDialog1.AddExtension = true;
openFileDialog1.Filter = filter ?? FilesystemFilter.AllFilesEntry;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
return UnFixString(openFileDialog1.FileName);
}
return "";
var initFileName = fileName is null ? null : FixString(fileName);
var initDir = initialDirectory is null ? null : FixString(initialDirectory);
if (initDir is null && initFileName is not null) initDir = Path.GetDirectoryName(initFileName);
var result = ((IDialogParent) MainForm).ShowFileOpenDialog(
filterStr: filter ?? FilesystemFilter.AllFilesEntry,
initDir: initDir ?? PathEntries.LuaAbsolutePath(),
initFileName: initFileName);
return result is not null ? UnFixString(result) : string.Empty;
}
[LuaMethodExample("local inforpic = forms.pictureBox( 333, 2, 48, 18, 24 );")]

View File

@ -654,26 +654,23 @@ namespace BizHawk.Client.EmuHawk
private FileInfo GetSaveFileFromUser()
{
var sfd = new SaveFileDialog();
string initDir;
string initFileName;
if (!string.IsNullOrWhiteSpace(LuaImp.ScriptList.Filename))
{
(sfd.InitialDirectory, sfd.FileName, _) = LuaImp.ScriptList.Filename.SplitPathToDirFileAndExt();
}
else if (!Game.IsNullInstance())
{
sfd.FileName = Game.FilesystemSafeName();
sfd.InitialDirectory = Config.PathEntries.LuaAbsolutePath();
(initDir, initFileName, _) = LuaImp.ScriptList.Filename.SplitPathToDirFileAndExt();
}
else
{
sfd.FileName = "NULL";
sfd.InitialDirectory = Config.PathEntries.LuaAbsolutePath();
initDir = Config!.PathEntries.LuaAbsolutePath();
initFileName = Game.IsNullInstance() ? "NULL" : Game.FilesystemSafeName();
}
sfd.Filter = SessionsFSFilterSet.ToString();
sfd.RestoreDirectory = true;
var result = this.ShowDialogWithTempMute(sfd);
return result.IsOk() ? new FileInfo(sfd.FileName) : null;
var result = this.ShowFileSaveDialog(
discardCWDChange: true,
filter: SessionsFSFilterSet,
initDir: initDir,
initFileName: initFileName);
return result is not null ? new FileInfo(result) : null;
}
private void SaveSessionAs()
@ -791,18 +788,11 @@ namespace BizHawk.Client.EmuHawk
{
var initDir = Config!.PathEntries.LuaAbsolutePath();
Directory.CreateDirectory(initDir);
var ofd = new OpenFileDialog
{
InitialDirectory = initDir,
Filter = SessionsFSFilterSet.ToString(),
RestoreDirectory = true,
Multiselect = false
};
var result = this.ShowDialogWithTempMute(ofd);
if (result.IsOk() && !string.IsNullOrWhiteSpace(ofd.FileName))
{
LoadLuaSession(ofd.FileName);
}
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: SessionsFSFilterSet,
initDir: initDir);
if (result is not null) LoadLuaSession(result);
}
private void SaveSessionMenuItem_Click(object sender, EventArgs e)
@ -850,26 +840,21 @@ namespace BizHawk.Client.EmuHawk
initDir = Config!.PathEntries.LuaAbsolutePath();
ext = Path.GetFileNameWithoutExtension(Game.Name);
}
var sfd = new SaveFileDialog
{
InitialDirectory = initDir,
DefaultExt = ".lua",
FileName = ext,
OverwritePrompt = true,
Filter = JustScriptsFSFilterSet.ToString(),
};
var result = this.ShowDialogWithTempMute(sfd);
if (!result.IsOk() || string.IsNullOrWhiteSpace(sfd.FileName)) return;
var result = this.ShowFileSaveDialog(
fileExt: ".lua",
filter: JustScriptsFSFilterSet,
initDir: initDir,
initFileName: ext);
if (string.IsNullOrWhiteSpace(result)) return;
string defaultTemplate = "while true do\n\temu.frameadvance();\nend";
File.WriteAllText(sfd.FileName, defaultTemplate);
LuaImp.ScriptList.Add(new LuaFile(Path.GetFileNameWithoutExtension(sfd.FileName), sfd.FileName));
Config.RecentLua.Add(sfd.FileName);
File.WriteAllText(result, defaultTemplate);
LuaImp.ScriptList.Add(new LuaFile(Path.GetFileNameWithoutExtension(result), result));
Config!.RecentLua.Add(result);
UpdateDialog();
Process.Start(new ProcessStartInfo
{
Verb = "Open",
FileName = sfd.FileName
FileName = result,
});
AddFileWatches();
}
@ -878,16 +863,12 @@ namespace BizHawk.Client.EmuHawk
{
var initDir = Config!.PathEntries.LuaAbsolutePath();
Directory.CreateDirectory(initDir);
var ofd = new OpenFileDialog
{
InitialDirectory = initDir,
Filter = ScriptsAndTextFilesFSFilterSet.ToString(),
RestoreDirectory = true,
Multiselect = true
};
var result = this.ShowDialogWithTempMute(ofd);
if (!result.IsOk() || ofd.FileNames is null) return;
foreach (var file in ofd.FileNames)
var result = this.ShowFileMultiOpenDialog(
discardCWDChange: true,
filter: ScriptsAndTextFilesFSFilterSet,
initDir: initDir);
if (result is null) return;
foreach (var file in result)
{
LoadLuaFile(file);
Config.RecentLua.Add(file);
@ -998,24 +979,21 @@ namespace BizHawk.Client.EmuHawk
}
var (dir, fileNoExt, _) = script.Path.SplitPathToDirFileAndExt();
var sfd = new SaveFileDialog
{
InitialDirectory = dir,
DefaultExt = ".lua",
FileName = $"{fileNoExt} (1)",
OverwritePrompt = true,
Filter = JustScriptsFSFilterSet.ToString(),
};
if (!sfd.ShowDialog().IsOk()) return;
var result = this.ShowFileSaveDialog(
fileExt: ".lua",
filter: JustScriptsFSFilterSet,
initDir: dir,
initFileName: $"{fileNoExt} (1)");
if (result is null) return;
string text = File.ReadAllText(script.Path);
File.WriteAllText(sfd.FileName, text);
LuaImp.ScriptList.Add(new LuaFile(Path.GetFileNameWithoutExtension(sfd.FileName), sfd.FileName));
Config.RecentLua.Add(sfd.FileName);
File.WriteAllText(result, text);
LuaImp.ScriptList.Add(new LuaFile(Path.GetFileNameWithoutExtension(result), result));
Config!.RecentLua.Add(result);
UpdateDialog();
Process.Start(new ProcessStartInfo
{
Verb = "Open",
FileName = sfd.FileName
FileName = result,
});
}
}

View File

@ -265,12 +265,6 @@ namespace BizHawk.Client.EmuHawk
private bool SaveMacroAs(MovieZone macro)
{
string suggestedFolder = SuggestedFolder(Config, Game);
using var dialog = new SaveFileDialog
{
InitialDirectory = suggestedFolder,
FileName = macro.Name,
Filter = MacrosFSFilterSet.ToString()
};
// Create directory?
bool create = false;
@ -280,34 +274,34 @@ namespace BizHawk.Client.EmuHawk
create = true;
}
if (this.ShowDialogWithTempMute(dialog) != DialogResult.OK)
var result = this.ShowFileSaveDialog(
filter: MacrosFSFilterSet,
initDir: suggestedFolder,
initFileName: macro.Name);
if (result is null)
{
if (create)
{
Directory.Delete(dialog.InitialDirectory);
Directory.Delete(suggestedFolder);
}
return false;
}
macro.Save(dialog.FileName);
Config.RecentMacros.Add(dialog.FileName);
macro.Save(result);
Config!.RecentMacros.Add(result);
return true;
}
private MovieZone LoadMacro(IEmulator emulator = null, ToolManager tools = null)
{
using var dialog = new OpenFileDialog
{
InitialDirectory = SuggestedFolder(Config, Game),
Filter = MacrosFSFilterSet.ToString()
};
if (this.ShowDialogWithTempMute(dialog) != DialogResult.OK) return null;
Config.RecentMacros.Add(dialog.FileName);
return new MovieZone(dialog.FileName, MainForm, emulator ?? Emulator, MovieSession, tools ?? Tools);
var result = this.ShowFileOpenDialog(
filter: MacrosFSFilterSet,
initDir: SuggestedFolder(Config, Game));
if (result is null) return null;
Config!.RecentMacros.Add(result);
return new MovieZone(result, MainForm, emulator ?? Emulator, MovieSession, tools ?? Tools);
}
}
}

View File

@ -254,20 +254,14 @@ namespace BizHawk.Client.EmuHawk
filename = Path.ChangeExtension(Game.FilesystemSafeName(), ".xml");
}
initialDirectory = Path.GetDirectoryName(filename);
initialDirectory = Path.GetDirectoryName(filename) ?? string.Empty;
}
using var sfd = new SaveFileDialog
{
FileName = filename,
InitialDirectory = initialDirectory,
Filter = BundlesFSFilterSet.ToString(),
};
if (this.ShowDialogWithTempMute(sfd) != DialogResult.Cancel)
{
NameBox.Text = sfd.FileName;
}
var result = this.ShowFileSaveDialog(
filter: BundlesFSFilterSet,
initDir: initialDirectory,
initFileName: filename);
if (result is not null) NameBox.Text = result;
}
private void SystemDropDown_SelectedIndexChanged(object sender, EventArgs e)

View File

@ -72,20 +72,14 @@ namespace BizHawk.Client.EmuHawk
private void BrowseButton_Click(object sender, EventArgs e)
{
using var ofd = new OpenFileDialog
{
InitialDirectory = _pathEntries.RomAbsolutePath(),
Filter = RomLoader.RomFilter.ToString(),
RestoreDirectory = true
};
if (this.ShowDialogWithTempMute(ofd) != DialogResult.OK) return;
var hawkPath = ofd.FileName;
var hawkPath = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: RomLoader.RomFilter,
initDir: _pathEntries.RomAbsolutePath());
if (hawkPath is null) return;
try
{
var file = new FileInfo(ofd.FileName);
FileInfo file = new(hawkPath);
var path = EmuHawkUtil.ResolveShortcut(file.FullName);
using var hf = new HawkFile(path);

View File

@ -103,17 +103,12 @@ namespace BizHawk.Client.EmuHawk
private void Export_Click(object sender, EventArgs e)
{
//acquire target
using var sfd = new SaveFileDialog
{
Filter = RenoiseFilesFSFilterSet.ToString(),
};
if (sfd.ShowDialog().IsOk())
{
return;
}
var outPath = this.ShowFileSaveDialog(
filter: RenoiseFilesFSFilterSet,
initDir: Config!.PathEntries.ToolsAbsolutePath());
if (outPath is null) return;
// configuration:
var outPath = sfd.FileName;
string templatePath = Path.Combine(Path.GetDirectoryName(outPath) ?? "", "template.xrns");
int configuredPatternLength = int.Parse(txtPatternLength.Text);

View File

@ -88,19 +88,11 @@ namespace BizHawk.Client.EmuHawk
{
filename = "";
}
// need to be fancy here, so call the ofd constructor directly instead of helper
var ofd = new OpenFileDialog
{
FileName = filename,
InitialDirectory = Config.PathEntries.MovieAbsolutePath(),
Filter = MoviesFSFilterSet.ToString(),
};
if (this.ShowDialogWithTempMute(ofd).IsOk())
{
LoadMovieFile(ofd.FileName, false);
}
var result = this.ShowFileOpenDialog(
filter: MoviesFSFilterSet,
initDir: Config!.PathEntries.MovieAbsolutePath(),
initFileName: filename);
if (result is not null) LoadMovieFile(result, askToSave: false);
}
/// <summary>
@ -792,11 +784,11 @@ namespace BizHawk.Client.EmuHawk
{
if (DialogController.ShowMessageBox2($"Bad data between frames {lastState} and {Emulator.Frame}. Save the relevant state (raw data)?", "Integrity Failed!"))
{
var sfd = new SaveFileDialog { FileName = "integrity.fresh" };
if (sfd.ShowDialog().IsOk())
var result = this.ShowFileSaveDialog(initDir: Config!.PathEntries.ToolsAbsolutePath(), initFileName: "integrity.fresh");
if (result is not null)
{
File.WriteAllBytes(sfd.FileName, state);
var path = Path.ChangeExtension(sfd.FileName, ".greenzoned");
File.WriteAllBytes(result, state);
var path = Path.ChangeExtension(result, ".greenzoned");
File.WriteAllBytes(path, greenZone);
}
}
@ -1054,7 +1046,7 @@ namespace BizHawk.Client.EmuHawk
private void SubtitlesMenuItem_Click(object sender, EventArgs e)
{
var form = new EditSubtitlesForm(DialogController, CurrentTasMovie, false);
using EditSubtitlesForm form = new(DialogController, CurrentTasMovie, Config!.PathEntries, readOnly: false);
form.ShowDialog();
}

View File

@ -81,33 +81,25 @@ namespace BizHawk.Client.EmuHawk
public FileInfo OpenFileDialog(string currentFile, string path, FilesystemFilterSet filterSet)
{
Directory.CreateDirectory(path);
using var ofd = new OpenFileDialog
{
FileName = !string.IsNullOrWhiteSpace(currentFile)
var result = this.ShowFileOpenDialog(
discardCWDChange: true,
filter: filterSet,
initDir: path,
initFileName: !string.IsNullOrWhiteSpace(currentFile)
? Path.GetFileName(currentFile)
: $"{Game.FilesystemSafeName()}.{filterSet.Filters.FirstOrDefault()?.Extensions.FirstOrDefault()}",
InitialDirectory = path,
Filter = filterSet.ToString(),
RestoreDirectory = true
};
var result = this.ShowDialogWithTempMute(ofd);
return result.IsOk() ? new FileInfo(ofd.FileName) : null;
: $"{Game.FilesystemSafeName()}.{filterSet.Filters.FirstOrDefault()?.Extensions.FirstOrDefault()}");
return result is not null ? new FileInfo(result) : null;
}
public static FileInfo SaveFileDialog(string currentFile, string path, FilesystemFilterSet filterSet, IDialogParent parent)
{
Directory.CreateDirectory(path);
using var sfd = new SaveFileDialog
{
FileName = Path.GetFileName(currentFile),
InitialDirectory = path,
Filter = filterSet.ToString(),
RestoreDirectory = true
};
var result = parent.ShowDialogWithTempMute(sfd);
return result.IsOk() ? new FileInfo(sfd.FileName) : null;
var result = parent.ShowFileSaveDialog(
discardCWDChange: true,
filter: filterSet,
initDir: path,
initFileName: Path.GetFileName(currentFile));
return result is not null ? new FileInfo(result) : null;
}
public FileInfo GetWatchFileFromUser(string currentFile)

View File

@ -285,27 +285,29 @@ namespace BizHawk.Client.EmuHawk
private FileInfo GetFileFromUser()
{
using var sfd = new SaveFileDialog();
string initDir;
string initFileName;
if (LogFile == null)
{
sfd.FileName = Game.FilesystemSafeName() + _extension;
sfd.InitialDirectory = Config.PathEntries.LogAbsolutePath();
initFileName = Game.FilesystemSafeName() + _extension;
initDir = Config!.PathEntries.LogAbsolutePath();
}
else if (!string.IsNullOrWhiteSpace(LogFile.FullName))
{
sfd.FileName = Game.FilesystemSafeName();
sfd.InitialDirectory = Path.GetDirectoryName(LogFile.FullName);
initFileName = Game.FilesystemSafeName();
initDir = Path.GetDirectoryName(LogFile.FullName) ?? string.Empty;
}
else
{
sfd.FileName = Path.GetFileNameWithoutExtension(LogFile.FullName);
sfd.InitialDirectory = Config.PathEntries.LogAbsolutePath();
initFileName = Path.GetFileNameWithoutExtension(LogFile.FullName);
initDir = Config!.PathEntries.LogAbsolutePath();
}
sfd.Filter = LogFilesFSFilterSet.ToString();
sfd.RestoreDirectory = true;
var result = this.ShowDialogWithTempMute(sfd);
return result.IsOk() ? new FileInfo(sfd.FileName) : null;
var result = this.ShowFileSaveDialog(
discardCWDChange: true,
filter: LogFilesFSFilterSet,
initDir: initDir,
initFileName: initFileName);
return result is not null ? new FileInfo(result) : null;
}
private void SaveLogMenuItem_Click(object sender, EventArgs e)