Mesen-SX/UI/Emulation/SaveStateManager.cs

117 lines
3.5 KiB
C#
Raw Normal View History

2019-03-12 09:15:57 -04:00
using Mesen.GUI.Config;
using Mesen.GUI.Config.Shortcuts;
using Mesen.GUI.Forms;
using Mesen.GUI.Properties;
using System;
using System.Collections.Generic;
2020-02-05 19:53:18 -05:00
using System.IO;
2019-03-12 09:15:57 -04:00
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Emulation
{
public static class SaveStateManager
{
private const int NumberOfSaveSlots = 10;
public static void UpdateStateMenu(ToolStripMenuItem menu, bool forSave)
{
for(uint i = 1; i <= NumberOfSaveSlots + (forSave ? 0 : 1); i++) {
2020-02-05 19:53:18 -05:00
string statePath = Path.Combine(ConfigManager.SaveStateFolder, EmuApi.GetRomInfo().GetRomName() + "_" + i + ".mss");
2019-03-12 09:15:57 -04:00
string label;
bool isAutoSaveSlot = i == NumberOfSaveSlots + 1;
string slotName = isAutoSaveSlot ? "Auto" : i.ToString();
2020-02-05 19:53:18 -05:00
if(!File.Exists(statePath)) {
2019-03-12 09:15:57 -04:00
label = slotName + ". " + ResourceHelper.GetMessage("EmptyState");
} else {
2020-02-05 19:53:18 -05:00
DateTime dateTime = new FileInfo(statePath).LastWriteTime;
2019-03-12 09:15:57 -04:00
label = slotName + ". " + dateTime.ToShortDateString() + " " + dateTime.ToShortTimeString();
}
if(i == NumberOfSaveSlots + 1) {
//Autosave slot (load only)
menu.DropDownItems[NumberOfSaveSlots + 1].Text = label;
} else {
menu.DropDownItems[(int)i - 1].Text = label;
}
}
}
public static void InitializeStateMenu(ToolStripMenuItem menu, bool forSave, ShortcutHandler shortcutHandler)
{
Action<uint> addSaveStateInfo = (i) => {
ToolStripMenuItem item = new ToolStripMenuItem();
menu.DropDownItems.Add(item);
if(forSave) {
shortcutHandler.BindShortcut(item, (EmulatorShortcut)((int)EmulatorShortcut.SaveStateSlot1 + i - 1));
} else {
shortcutHandler.BindShortcut(item, (EmulatorShortcut)((int)EmulatorShortcut.LoadStateSlot1 + i - 1));
}
};
for(uint i = 1; i <= NumberOfSaveSlots; i++) {
addSaveStateInfo(i);
}
if(!forSave) {
menu.DropDownItems.Add("-");
addSaveStateInfo(NumberOfSaveSlots + 1);
menu.DropDownItems.Add("-");
ToolStripMenuItem loadFromFile = new ToolStripMenuItem(ResourceHelper.GetMessage("LoadFromFile"), Resources.Folder);
menu.DropDownItems.Add(loadFromFile);
shortcutHandler.BindShortcut(loadFromFile, EmulatorShortcut.LoadStateFromFile);
} else {
menu.DropDownItems.Add("-");
ToolStripMenuItem saveToFile = new ToolStripMenuItem(ResourceHelper.GetMessage("SaveToFile"), Resources.SaveFloppy);
menu.DropDownItems.Add(saveToFile);
shortcutHandler.BindShortcut(saveToFile, EmulatorShortcut.SaveStateToFile);
}
}
public static void SaveState(uint slot)
{
if(EmuRunner.IsRunning()) {
EmuApi.SaveState(slot);
}
}
public static void LoadState(uint slot)
{
if(EmuRunner.IsRunning()) {
EmuApi.LoadState(slot);
}
}
public static void LoadStateFromFile()
{
if(EmuRunner.IsRunning()) {
using(OpenFileDialog ofd = new OpenFileDialog()) {
ofd.InitialDirectory = ConfigManager.SaveStateFolder;
ofd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
if(ofd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
2019-03-12 09:15:57 -04:00
EmuApi.LoadStateFile(ofd.FileName);
}
}
}
}
public static void SaveStateToFile()
{
if(EmuRunner.IsRunning()) {
using(SaveFileDialog sfd = new SaveFileDialog()) {
sfd.InitialDirectory = ConfigManager.SaveStateFolder;
sfd.FileName = EmuApi.GetRomInfo().GetRomName() + ".mss";
2019-03-12 09:15:57 -04:00
sfd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
if(sfd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
2019-03-12 09:15:57 -04:00
EmuApi.SaveStateFile(sfd.FileName);
}
}
}
}
}
}