BizHawk/BizHawk.Client.EmuHawk/MainForm.Events.cs

2461 lines
76 KiB
C#

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
using BizHawk.Emulation.Cores.Calculators;
using BizHawk.Emulation.Cores.ColecoVision;
using BizHawk.Emulation.Cores.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.NES;
using BizHawk.Emulation.Cores.Nintendo.N64;
using BizHawk.Emulation.Cores.Nintendo.SNES;
using BizHawk.Emulation.Cores.PCEngine;
using BizHawk.Emulation.Cores.Sega.MasterSystem;
using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES;
using BizHawk.Client.Common;
using BizHawk.Client.EmuHawk.CustomControls;
using BizHawk.Client.EmuHawk.WinFormExtensions;
using BizHawk.Client.EmuHawk.ToolExtensions;
namespace BizHawk.Client.EmuHawk
{
partial class MainForm
{
#region File Menu
private void FileSubMenu_DropDownOpened(object sender, EventArgs e)
{
SaveStateSubMenu.Enabled =
LoadStateSubMenu.Enabled =
SaveSlotSubMenu.Enabled =
Global.Emulator.HasSavestates();
OpenRomMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Open ROM"].Bindings;
CloseRomMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Close ROM"].Bindings;
MovieSubMenu.Enabled =
CloseRomMenuItem.Enabled =
!Global.Emulator.IsNull();
var hasSaveRam = Global.Emulator.HasSaveRam();
bool needBold = hasSaveRam && Global.Emulator.AsSaveRam().SaveRamModified;
SaveRAMSubMenu.Enabled = hasSaveRam;
if (SaveRAMSubMenu.Font.Bold != needBold)
{
var font = new System.Drawing.Font(SaveRAMSubMenu.Font, needBold ? FontStyle.Bold : FontStyle.Regular);
SaveRAMSubMenu.Font.Dispose();
SaveRAMSubMenu.Font = font;
}
}
private void RecentRomMenuItem_DropDownOpened(object sender, EventArgs e)
{
RecentRomSubMenu.DropDownItems.Clear();
RecentRomSubMenu.DropDownItems.AddRange(
Global.Config.RecentRoms.RecentMenu(LoadRomFromRecent, true));
}
private void SaveStateSubMenu_DropDownOpened(object sender, EventArgs e)
{
SaveState0MenuItem.Font = new Font(
SaveState0MenuItem.Font.FontFamily,
SaveState0MenuItem.Font.Size,
_stateSlots.HasSlot(0) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState1MenuItem.Font = new Font(
SaveState1MenuItem.Font.FontFamily,
SaveState1MenuItem.Font.Size,
_stateSlots.HasSlot(1) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState2MenuItem.Font = new Font(
SaveState2MenuItem.Font.FontFamily,
SaveState2MenuItem.Font.Size,
_stateSlots.HasSlot(2) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState3MenuItem.Font = new Font(
SaveState3MenuItem.Font.FontFamily,
SaveState3MenuItem.Font.Size,
_stateSlots.HasSlot(3) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState4MenuItem.Font = new Font(
SaveState4MenuItem.Font.FontFamily,
SaveState4MenuItem.Font.Size,
_stateSlots.HasSlot(4) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState5MenuItem.Font = new Font(
SaveState5MenuItem.Font.FontFamily,
SaveState5MenuItem.Font.Size,
_stateSlots.HasSlot(5) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState6MenuItem.Font = new Font(
SaveState6MenuItem.Font.FontFamily,
SaveState6MenuItem.Font.Size,
_stateSlots.HasSlot(6) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState7MenuItem.Font = new Font(
SaveState7MenuItem.Font.FontFamily,
SaveState7MenuItem.Font.Size,
_stateSlots.HasSlot(7) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState8MenuItem.Font = new Font(
SaveState8MenuItem.Font.FontFamily,
SaveState8MenuItem.Font.Size,
_stateSlots.HasSlot(8) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState9MenuItem.Font = new Font(
SaveState9MenuItem.Font.FontFamily,
SaveState9MenuItem.Font.Size,
_stateSlots.HasSlot(9) ? (FontStyle.Italic | FontStyle.Bold) : FontStyle.Regular
);
SaveState1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 1"].Bindings;
SaveState2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 2"].Bindings;
SaveState3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 3"].Bindings;
SaveState4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 4"].Bindings;
SaveState5MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 5"].Bindings;
SaveState6MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 6"].Bindings;
SaveState7MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 7"].Bindings;
SaveState8MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 8"].Bindings;
SaveState9MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 9"].Bindings;
SaveState0MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save State 0"].Bindings;
SaveNamedStateMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save Named State"].Bindings;
}
private void LoadStateSubMenu_DropDownOpened(object sender, EventArgs e)
{
LoadState1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 1"].Bindings;
LoadState2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 2"].Bindings;
LoadState3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 3"].Bindings;
LoadState4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 4"].Bindings;
LoadState5MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 5"].Bindings;
LoadState6MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 6"].Bindings;
LoadState7MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 7"].Bindings;
LoadState8MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 8"].Bindings;
LoadState9MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 9"].Bindings;
LoadState0MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load State 0"].Bindings;
LoadNamedStateMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Load Named State"].Bindings;
AutoloadLastSlotMenuItem.Checked = Global.Config.AutoLoadLastSaveSlot;
LoadState1MenuItem.Enabled = _stateSlots.HasSlot(1);
LoadState2MenuItem.Enabled = _stateSlots.HasSlot(2);
LoadState3MenuItem.Enabled = _stateSlots.HasSlot(3);
LoadState4MenuItem.Enabled = _stateSlots.HasSlot(4);
LoadState5MenuItem.Enabled = _stateSlots.HasSlot(5);
LoadState6MenuItem.Enabled = _stateSlots.HasSlot(6);
LoadState7MenuItem.Enabled = _stateSlots.HasSlot(7);
LoadState8MenuItem.Enabled = _stateSlots.HasSlot(8);
LoadState9MenuItem.Enabled = _stateSlots.HasSlot(9);
LoadState0MenuItem.Enabled = _stateSlots.HasSlot(0);
}
private void SaveSlotSubMenu_DropDownOpened(object sender, EventArgs e)
{
SelectSlot0MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 0"].Bindings;
SelectSlot1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 1"].Bindings;
SelectSlot2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 2"].Bindings;
SelectSlot3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 3"].Bindings;
SelectSlot4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 4"].Bindings;
SelectSlot5MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 5"].Bindings;
SelectSlot6MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 6"].Bindings;
SelectSlot7MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 7"].Bindings;
SelectSlot8MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 8"].Bindings;
SelectSlot9MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Select State 9"].Bindings;
PreviousSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Previous Slot"].Bindings;
NextSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Next Slot"].Bindings;
SaveToCurrentSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Quick Save"].Bindings;
LoadCurrentSlotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Quick Load"].Bindings;
SelectSlot0MenuItem.Checked = false;
SelectSlot1MenuItem.Checked = false;
SelectSlot2MenuItem.Checked = false;
SelectSlot3MenuItem.Checked = false;
SelectSlot4MenuItem.Checked = false;
SelectSlot5MenuItem.Checked = false;
SelectSlot6MenuItem.Checked = false;
SelectSlot7MenuItem.Checked = false;
SelectSlot8MenuItem.Checked = false;
SelectSlot9MenuItem.Checked = false;
SelectSlot1MenuItem.Checked = false;
switch (Global.Config.SaveSlot)
{
case 0:
SelectSlot0MenuItem.Checked = true;
break;
case 1:
SelectSlot1MenuItem.Checked = true;
break;
case 2:
SelectSlot2MenuItem.Checked = true;
break;
case 3:
SelectSlot3MenuItem.Checked = true;
break;
case 4:
SelectSlot4MenuItem.Checked = true;
break;
case 5:
SelectSlot5MenuItem.Checked = true;
break;
case 6:
SelectSlot6MenuItem.Checked = true;
break;
case 7:
SelectSlot7MenuItem.Checked = true;
break;
case 8:
SelectSlot8MenuItem.Checked = true;
break;
case 9:
SelectSlot9MenuItem.Checked = true;
break;
}
}
private void MovieSubMenu_DropDownOpened(object sender, EventArgs e)
{
FullMovieLoadstatesMenuItem.Enabled = !Global.MovieSession.MultiTrack.IsActive;
StopMovieWithoutSavingMenuItem.Enabled = Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.Changes;
StopMovieMenuItem.Enabled
= PlayFromBeginningMenuItem.Enabled
= SaveMovieMenuItem.Enabled
= Global.MovieSession.Movie.IsActive;
PlayMovieMenuItem.Enabled =
RecordMovieMenuItem.Enabled =
RecentMovieSubMenu.Enabled =
!Global.MovieSession.Movie.IsActive;
ReadonlyMenuItem.Checked = Global.MovieSession.ReadOnly;
AutomaticallyBackupMoviesMenuItem.Checked = Global.Config.EnableBackupMovies;
FullMovieLoadstatesMenuItem.Checked = Global.Config.VBAStyleMovieLoadState;
ReadonlyMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle read-only"].Bindings;
RecordMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Record Movie"].Bindings;
PlayMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Play Movie"].Bindings;
StopMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Stop Movie"].Bindings;
PlayFromBeginningMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Play from beginning"].Bindings;
SaveMovieMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Save Movie"].Bindings;
}
private void RecentMovieSubMenu_DropDownOpened(object sender, EventArgs e)
{
RecentMovieSubMenu.DropDownItems.Clear();
RecentMovieSubMenu.DropDownItems.AddRange(
Global.Config.RecentMovies.RecentMenu(LoadMoviesFromRecent, true));
}
private void MovieEndSubMenu_DropDownOpened(object sender, EventArgs e)
{
MovieEndFinishMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Finish;
MovieEndRecordMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Record;
MovieEndStopMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Stop;
MovieEndPauseMenuItem.Checked = Global.Config.MovieEndAction == MovieEndAction.Pause;
// Arguably an IControlMainForm property should be set here, but in reality only Tastudio is ever going to interfere with this logic
MovieEndFinishMenuItem.Enabled =
MovieEndRecordMenuItem.Enabled =
MovieEndStopMenuItem.Enabled =
MovieEndPauseMenuItem.Enabled =
!GlobalWin.Tools.Has<TAStudio>();
}
private void AVSubMenu_DropDownOpened(object sender, EventArgs e)
{
RecordAVMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Record A/V"].Bindings;
StopAVIMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Stop A/V"].Bindings;
CaptureOSDMenuItem.Checked = Global.Config.AVI_CaptureOSD;
if (_currAviWriter == null)
{
RecordAVMenuItem.Enabled = true;
StopAVIMenuItem.Enabled = false;
}
else
{
RecordAVMenuItem.Enabled = false;
StopAVIMenuItem.Enabled = true;
}
}
private void ScreenshotSubMenu_DropDownOpening(object sender, EventArgs e)
{
ScreenshotCaptureOSDMenuItem1.Checked = Global.Config.Screenshot_CaptureOSD;
ScreenshotMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Screenshot"].Bindings;
}
private void OpenRomMenuItem_Click(object sender, EventArgs e)
{
OpenRom();
}
private void CloseRomMenuItem_Click(object sender, EventArgs e)
{
CloseRom();
}
private void Savestate1MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave1"); }
private void Savestate2MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave2"); }
private void Savestate3MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave3"); }
private void Savestate4MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave4"); }
private void Savestate5MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave5"); }
private void Savestate6MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave6"); }
private void Savestate7MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave7"); }
private void Savestate8MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave8"); }
private void Savestate9MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave9"); }
private void Savestate0MenuItem_Click(object sender, EventArgs e) { SaveQuickSave("QuickSave0"); }
private void SaveNamedStateMenuItem_Click(object sender, EventArgs e)
{
SaveStateAs();
}
private void Loadstate1MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave1"); }
private void Loadstate2MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave2"); }
private void Loadstate3MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave3"); }
private void Loadstate4MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave4"); }
private void Loadstate5MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave5"); }
private void Loadstate6MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave6"); }
private void Loadstate7MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave7"); }
private void Loadstate8MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave8"); }
private void Loadstate9MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave9"); }
private void Loadstate0MenuItem_Click(object sender, EventArgs e) { LoadQuickSave("QuickSave0"); }
private void LoadNamedStateMenuItem_Click(object sender, EventArgs e)
{
LoadStateAs();
}
private void AutoloadLastSlotMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoLoadLastSaveSlot ^= true;
}
private void SelectSlotMenuItems_Click(object sender, EventArgs e)
{
if (sender == SelectSlot0MenuItem) Global.Config.SaveSlot = 0;
else if (sender == SelectSlot1MenuItem) Global.Config.SaveSlot = 1;
else if (sender == SelectSlot2MenuItem) Global.Config.SaveSlot = 2;
else if (sender == SelectSlot3MenuItem) Global.Config.SaveSlot = 3;
else if (sender == SelectSlot4MenuItem) Global.Config.SaveSlot = 4;
else if (sender == SelectSlot5MenuItem) Global.Config.SaveSlot = 5;
else if (sender == SelectSlot6MenuItem) Global.Config.SaveSlot = 6;
else if (sender == SelectSlot7MenuItem) Global.Config.SaveSlot = 7;
else if (sender == SelectSlot8MenuItem) Global.Config.SaveSlot = 8;
else if (sender == SelectSlot9MenuItem) Global.Config.SaveSlot = 9;
UpdateStatusSlots();
SaveSlotSelectedMessage();
}
private void PreviousSlotMenuItem_Click(object sender, EventArgs e)
{
PreviousSlot();
}
private void NextSlotMenuItem_Click(object sender, EventArgs e)
{
NextSlot();
}
private void SaveToCurrentSlotMenuItem_Click(object sender, EventArgs e)
{
SaveQuickSave("QuickSave" + Global.Config.SaveSlot);
}
private void LoadCurrentSlotMenuItem_Click(object sender, EventArgs e)
{
LoadQuickSave("QuickSave" + Global.Config.SaveSlot);
}
private void ReadonlyMenuItem_Click(object sender, EventArgs e)
{
ToggleReadOnly();
}
private void RecordMovieMenuItem_Click(object sender, EventArgs e)
{
if (Global.MovieSession.Movie.IsActive)
{
return;
}
if (!Global.Emulator.Attributes().Released)
{
var result = MessageBox.Show
(this, "Thanks for using Bizhawk! The emulation core you have selected " +
"is currently BETA-status. We appreciate your help in testing Bizhawk. " +
"You can record a movie on this core if you'd like to, but expect to " +
"encounter bugs and sync problems. Continue?", "BizHawk", MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
return;
}
}
else if (Global.Emulator is LibsnesCore)
{
var snes = (LibsnesCore)Global.Emulator;
if (snes.CurrentProfile == "Performance")
{
var box = new MsgBox(
"While the performance core is faster, it is not stable enough for movie recording\n\nSwitch to Compatibility?",
"Stability Warning",
MessageBoxIcon.Warning);
box.SetButtons(
new[] { "Switch", "Cancel" },
new[] { DialogResult.Yes, DialogResult.Cancel });
box.MaximumSize = new Size(450, 350);
box.SetMessageToAutoSize();
var result = box.ShowDialog();
if (result == DialogResult.Yes)
{
var ss = snes.GetSyncSettings();
ss.Profile = "Compatibility";
snes.PutSyncSettings(ss);
}
else if (result == DialogResult.Cancel)
{
return;
}
}
}
new RecordMovie().ShowDialog();
}
private void PlayMovieMenuItem_Click(object sender, EventArgs e)
{
if (!Global.MovieSession.Movie.IsActive)
{
new PlayMovie().ShowDialog();
}
}
private void StopMovieMenuItem_Click(object sender, EventArgs e)
{
StopMovie();
}
private void PlayFromBeginningMenuItem_Click(object sender, EventArgs e)
{
RestartMovie();
}
private void ImportMovieMenuItem_Click(object sender, EventArgs e)
{
var ofd = new OpenFileDialog
{
InitialDirectory = PathManager.GetRomsPath(Global.Emulator.SystemId),
Multiselect = true,
Filter = FormatFilter(
"Movie Files", "*.fm2;*.mc2;*.mcm;*.mmv;*.gmv;*.vbm;*.lsmv;*.fcm;*.fmv;*.vmv;*.nmv;*.smv;*.ymv;*.zmv;*.bkm",
"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",
"BizHawk Bkm", "*.bkm",
"All Files", "*.*"),
RestoreDirectory = false
};
var result = ofd.ShowHawkDialog();
if (result == DialogResult.OK)
{
foreach (var fn in ofd.FileNames)
{
ProcessMovieImport(fn);
}
}
}
private void SaveMovieMenuItem_Click(object sender, EventArgs e)
{
SaveMovie();
}
private void StopMovieWithoutSavingMenuItem_Click(object sender, EventArgs e)
{
StopMovie(saveChanges: false);
}
private void AutomaticMovieBackupMenuItem_Click(object sender, EventArgs e)
{
Global.Config.EnableBackupMovies ^= true;
}
private void FullMovieLoadstatesMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VBAStyleMovieLoadState ^= true;
}
private void MovieEndFinishMenuItem_Click(object sender, EventArgs e)
{
Global.Config.MovieEndAction = MovieEndAction.Finish;
}
private void MovieEndRecordMenuItem_Click(object sender, EventArgs e)
{
Global.Config.MovieEndAction = MovieEndAction.Record;
}
private void MovieEndStopMenuItem_Click(object sender, EventArgs e)
{
Global.Config.MovieEndAction = MovieEndAction.Stop;
}
private void MovieEndPauseMenuItem_Click(object sender, EventArgs e)
{
Global.Config.MovieEndAction = MovieEndAction.Pause;
}
private void RecordAVMenuItem_Click(object sender, EventArgs e)
{
RecordAv();
}
private void StopAVMenuItem_Click(object sender, EventArgs e)
{
StopAv();
}
private void SynclessRecordingMenuItem_Click(object sender, EventArgs e)
{
new SynclessRecordingTools().Run();
}
private void CaptureOSDMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AVI_CaptureOSD ^= true;
}
private void ScreenshotMenuItem_Click(object sender, EventArgs e)
{
TakeScreenshot();
}
private void ScreenshotAsMenuItem_Click(object sender, EventArgs e)
{
var path = String.Format(PathManager.ScreenshotPrefix(Global.Game) + ".{0:yyyy-MM-dd HH.mm.ss}.png", DateTime.Now);
var sfd = new SaveFileDialog
{
InitialDirectory = Path.GetDirectoryName(path),
FileName = Path.GetFileName(path),
Filter = "PNG File (*.png)|*.png"
};
var result = sfd.ShowHawkDialog();
if (result == DialogResult.OK)
{
TakeScreenshot(sfd.FileName);
}
}
private void ScreenshotClipboardMenuItem_Click(object sender, EventArgs e)
{
TakeScreenshotToClipboard();
}
private void ScreenshotClientClipboardMenuItem_Click(object sender, EventArgs e)
{
using (var bb = GlobalWin.DisplayManager.RenderOffscreen(Global.Emulator.VideoProvider, Global.Config.Screenshot_CaptureOSD))
{
bb.Normalize(true);
using (var img = bb.ToSysdrawingBitmap())
Clipboard.SetImage(img);
}
GlobalWin.OSD.AddMessage("Screenshot (client) saved to clipboard.");
}
private void ScreenshotCaptureOSDMenuItem_Click(object sender, EventArgs e)
{
Global.Config.Screenshot_CaptureOSD ^= true;
}
private void ExitMenuItem_Click(object sender, EventArgs e)
{
if (GlobalWin.Tools.AskSave())
{
Close();
}
}
#endregion
#region Emulation Menu
private void emulationToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
PauseMenuItem.Checked = _didMenuPause ? _wasPaused : EmulatorPaused;
SoftResetMenuItem.Enabled = Global.Emulator.ControllerDefinition.BoolButtons.Contains("Reset") &&
(!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished);
HardResetMenuItem.Enabled = Global.Emulator.ControllerDefinition.BoolButtons.Contains("Power") &&
(!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished);
PauseMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Pause"].Bindings;
RebootCoreMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Reboot Core"].Bindings;
SoftResetMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Soft Reset"].Bindings;
HardResetMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Hard Reset"].Bindings;
}
private void PauseMenuItem_Click(object sender, EventArgs e)
{
if (IsTurboSeeking || IsSeeking)
{
PauseOnFrame = null;
}
else if (EmulatorPaused)
{
UnpauseEmulator();
}
else
{
PauseEmulator();
}
}
private void PowerMenuItem_Click(object sender, EventArgs e)
{
RebootCore();
}
private void SoftResetMenuItem_Click(object sender, EventArgs e)
{
SoftReset();
}
private void HardResetMenuItem_Click(object sender, EventArgs e)
{
HardReset();
}
#endregion
#region View
private void ViewSubMenu_DropDownOpened(object sender, EventArgs e)
{
DisplayFPSMenuItem.Checked = Global.Config.DisplayFPS;
DisplayFrameCounterMenuItem.Checked = Global.Config.DisplayFrameCounter;
DisplayLagCounterMenuItem.Checked = Global.Config.DisplayLagCounter;
DisplayInputMenuItem.Checked = Global.Config.DisplayInput;
DisplayRerecordCountMenuItem.Checked = Global.Config.DisplayRerecordCount;
DisplaySubtitlesMenuItem.Checked = Global.Config.DisplaySubtitles;
DisplayFPSMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Display FPS"].Bindings;
DisplayFrameCounterMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Frame Counter"].Bindings;
DisplayLagCounterMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Lag Counter"].Bindings;
DisplayInputMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Input Display"].Bindings;
SwitchToFullscreenMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Full Screen"].Bindings;
DisplayStatusBarMenuItem.Checked = Global.Config.DisplayStatusBar;
DisplayLogWindowMenuItem.Checked = Global.Config.ShowLogWindow;
DisplayLagCounterMenuItem.Enabled = Global.Emulator.CanPollInput();
}
private void WindowSizeSubMenu_DropDownOpened(object sender, EventArgs e)
{
x1MenuItem.Checked =
x2MenuItem.Checked =
x3MenuItem.Checked =
x4MenuItem.Checked =
x5MenuItem.Checked = false;
switch (Global.Config.TargetZoomFactor)
{
case 1: x1MenuItem.Checked = true; break;
case 2: x2MenuItem.Checked = true; break;
case 3: x3MenuItem.Checked = true; break;
case 4: x4MenuItem.Checked = true; break;
case 5: x5MenuItem.Checked = true; break;
case 10: mzMenuItem.Checked = true; break;
}
}
private void WindowSize_Click(object sender, EventArgs e)
{
if (sender == x1MenuItem) Global.Config.TargetZoomFactor = 1;
if (sender == x2MenuItem) Global.Config.TargetZoomFactor = 2;
if (sender == x3MenuItem) Global.Config.TargetZoomFactor = 3;
if (sender == x4MenuItem) Global.Config.TargetZoomFactor = 4;
if (sender == x5MenuItem) Global.Config.TargetZoomFactor = 5;
if (sender == mzMenuItem) Global.Config.TargetZoomFactor = 10;
FrameBufferResized();
}
private void SwitchToFullscreenMenuItem_Click(object sender, EventArgs e)
{
ToggleFullscreen();
}
private void DisplayFPSMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
ToggleFPS();
}
private void DisplayFrameCounterMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
ToggleFrameCounter();
}
private void DisplayLagCounterMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
ToggleLagCounter();
}
private void DisplayInputMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
ToggleInputDisplay();
}
private void DisplayRerecordsMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
Global.Config.DisplayRerecordCount ^= true;
}
private void DisplaySubtitlesMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
Global.Config.DisplaySubtitles ^= true;
}
private void DisplayStatusBarMenuItem_Click(object sender, EventArgs e)
{
Global.Config.DisplayStatusBar ^= true;
if (!_inFullscreen)
{
MainStatusBar.Visible = Global.Config.DisplayStatusBar;
PerformLayout();
FrameBufferResized();
}
}
private void DisplayLogWindowMenuItem_Click(object sender, EventArgs e)
{
Global.Config.ShowLogWindow ^= true;
if (Global.Config.ShowLogWindow)
{
LogConsole.ShowConsole();
}
else
{
LogConsole.HideConsole();
}
}
#endregion
#region Config
private void ConfigSubMenu_DropDownOpened(object sender, EventArgs e)
{
ControllersMenuItem.Enabled = Global.Emulator.ControllerDefinition.Any();
RewindOptionsMenuItem.Enabled = Global.Emulator.HasSavestates();
}
private void FrameSkipMenuItem_DropDownOpened(object sender, EventArgs e)
{
MinimizeSkippingMenuItem.Checked = Global.Config.AutoMinimizeSkipping;
ClickThrottleMenuItem.Checked = Global.Config.ClockThrottle;
VsyncThrottleMenuItem.Checked = Global.Config.VSyncThrottle;
NeverSkipMenuItem.Checked = Global.Config.FrameSkip == 0;
Frameskip1MenuItem.Checked = Global.Config.FrameSkip == 1;
Frameskip2MenuItem.Checked = Global.Config.FrameSkip == 2;
Frameskip3MenuItem.Checked = Global.Config.FrameSkip == 3;
Frameskip4MenuItem.Checked = Global.Config.FrameSkip == 4;
Frameskip5MenuItem.Checked = Global.Config.FrameSkip == 5;
Frameskip6MenuItem.Checked = Global.Config.FrameSkip == 6;
Frameskip7MenuItem.Checked = Global.Config.FrameSkip == 7;
Frameskip8MenuItem.Checked = Global.Config.FrameSkip == 8;
Frameskip9MenuItem.Checked = Global.Config.FrameSkip == 9;
MinimizeSkippingMenuItem.Enabled = !NeverSkipMenuItem.Checked;
if (!MinimizeSkippingMenuItem.Enabled) MinimizeSkippingMenuItem.Checked = true;
AudioThrottleMenuItem.Enabled = Global.Config.SoundEnabled;
AudioThrottleMenuItem.Checked = Global.Config.SoundThrottle;
VsyncEnabledMenuItem.Checked = Global.Config.VSync;
Speed100MenuItem.Checked = Global.Config.SpeedPercent == 100;
Speed100MenuItem.Image = (Global.Config.SpeedPercentAlternate == 100) ? Properties.Resources.FastForward : null;
Speed150MenuItem.Checked = Global.Config.SpeedPercent == 150;
Speed150MenuItem.Image = (Global.Config.SpeedPercentAlternate == 150) ? Properties.Resources.FastForward : null;
Speed200MenuItem.Checked = Global.Config.SpeedPercent == 200;
Speed200MenuItem.Image = (Global.Config.SpeedPercentAlternate == 200) ? Properties.Resources.FastForward : null;
Speed75MenuItem.Checked = Global.Config.SpeedPercent == 75;
Speed75MenuItem.Image = (Global.Config.SpeedPercentAlternate == 75) ? Properties.Resources.FastForward : null;
Speed50MenuItem.Checked = Global.Config.SpeedPercent == 50;
Speed50MenuItem.Image = (Global.Config.SpeedPercentAlternate == 50) ? Properties.Resources.FastForward : null;
Speed50MenuItem.Enabled =
Speed75MenuItem.Enabled =
Speed100MenuItem.Enabled =
Speed150MenuItem.Enabled =
Speed200MenuItem.Enabled =
Global.Config.ClockThrottle;
}
private void KeyPriorityMenuItem_DropDownOpened(object sender, EventArgs e)
{
switch (Global.Config.Input_Hotkey_OverrideOptions)
{
default:
case 0:
BothHkAndControllerMenuItem.Checked = true;
InputOverHkMenuItem.Checked = false;
HkOverInputMenuItem.Checked = false;
break;
case 1:
BothHkAndControllerMenuItem.Checked = false;
InputOverHkMenuItem.Checked = true;
HkOverInputMenuItem.Checked = false;
break;
case 2:
BothHkAndControllerMenuItem.Checked = false;
InputOverHkMenuItem.Checked = false;
HkOverInputMenuItem.Checked = true;
break;
}
}
private void CoresSubMenu_DropDownOpened(object sender, EventArgs e)
{
GBInSGBMenuItem.Checked = Global.Config.GB_AsSGB;
NesInQuickNESMenuItem.Checked = Global.Config.NES_InQuickNES;
SnesWithSnes9xMenuItem.Checked = Global.Config.SNES_InSnes9x;
SnesWithSnes9xMenuItem.Visible = VersionInfo.DeveloperBuild;
}
private void ControllersMenuItem_Click(object sender, EventArgs e)
{
var controller = new ControllerConfig(Global.Emulator.ControllerDefinition);
if (controller.ShowDialog() == DialogResult.OK)
{
InitControls();
InputManager.SyncControls();
}
}
private void HotkeysMenuItem_Click(object sender, EventArgs e)
{
if (new HotkeyConfig().ShowDialog() == DialogResult.OK)
{
InitControls();
InputManager.SyncControls();
}
}
private void FirmwaresMenuItem_Click(object sender, EventArgs e)
{
new FirmwaresConfig().ShowDialog();
}
private void MessagesMenuItem_Click(object sender, EventArgs e)
{
new MessageConfig().ShowDialog();
}
private void PathsMenuItem_Click(object sender, EventArgs e)
{
new PathConfig().ShowDialog();
}
private void SoundMenuItem_Click(object sender, EventArgs e)
{
if (new SoundConfig().ShowDialog() == DialogResult.OK)
{
RewireSound();
}
}
private void AutofireMenuItem_Click(object sender, EventArgs e)
{
new AutofireConfig().ShowDialog();
}
private void RewindOptionsMenuItem_Click(object sender, EventArgs e)
{
new RewindConfig().ShowDialog();
}
private void FileExtensionsMenuItem_Click(object sender, EventArgs e)
{
new FileExtensionPreferences().ShowDialog();
}
private void CustomizeMenuItem_Click(object sender, EventArgs e)
{
new EmuHawkOptions().ShowDialog();
}
private void ProfilesMenuItem_Click(object sender, EventArgs e)
{
if (new ProfileConfig().ShowDialog() == DialogResult.OK)
{
GlobalWin.OSD.AddMessage("Profile settings saved");
//We hide the FirstBoot items since the user setup a Profile
//Is it a bad thing to do this constantly?
Global.Config.FirstBoot = false;
ProfileFirstBootLabel.Visible = false;
}
else
{
GlobalWin.OSD.AddMessage("Profile config aborted");
}
}
private void ClickThrottleMenuItem_Click(object sender, EventArgs e)
{
Global.Config.ClockThrottle ^= true;
if (Global.Config.ClockThrottle)
{
var old = Global.Config.SoundThrottle;
Global.Config.SoundThrottle = false;
if (old)
{
RewireSound();
}
old = Global.Config.VSyncThrottle;
Global.Config.VSyncThrottle = false;
if (old)
{
GlobalWin.PresentationPanel.Resized = true;
}
}
LimitFrameRateMessage();
}
private void AudioThrottleMenuItem_Click(object sender, EventArgs e)
{
Global.Config.SoundThrottle ^= true;
RewireSound();
if (Global.Config.SoundThrottle)
{
Global.Config.ClockThrottle = false;
var old = Global.Config.VSyncThrottle;
Global.Config.VSyncThrottle = false;
if (old)
{
GlobalWin.PresentationPanel.Resized = true;
}
}
}
private void VsyncThrottleMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VSyncThrottle ^= true;
GlobalWin.PresentationPanel.Resized = true;
if (Global.Config.VSyncThrottle)
{
Global.Config.ClockThrottle = false;
var old = Global.Config.SoundThrottle;
Global.Config.SoundThrottle = false;
if (old)
{
RewireSound();
}
}
VsyncMessage();
}
private void VsyncEnabledMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VSync ^= true;
if (!Global.Config.VSyncThrottle) // when vsync throttle is on, vsync is forced to on, so no change to make here
{
GlobalWin.PresentationPanel.Resized = true;
}
}
private void MinimizeSkippingMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoMinimizeSkipping ^= true;
}
private void NeverSkipMenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 0; FrameSkipMessage(); }
private void Frameskip1MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 1; FrameSkipMessage(); }
private void Frameskip2MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 2; FrameSkipMessage(); }
private void Frameskip3MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 3; FrameSkipMessage(); }
private void Frameskip4MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 4; FrameSkipMessage(); }
private void Frameskip5MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 5; FrameSkipMessage(); }
private void Frameskip6MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 6; FrameSkipMessage(); }
private void Frameskip7MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 7; FrameSkipMessage(); }
private void Frameskip8MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 8; FrameSkipMessage(); }
private void Frameskip9MenuItem_Click(object sender, EventArgs e) { Global.Config.FrameSkip = 9; FrameSkipMessage(); }
private void Speed50MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(50); }
private void Speed75MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(75); }
private void Speed100MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(100); }
private void Speed150MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(150); }
private void Speed200MenuItem_Click(object sender, EventArgs e) { ClickSpeedItem(200); }
private void BothHkAndControllerMenuItem_Click(object sender, EventArgs e)
{
Global.Config.Input_Hotkey_OverrideOptions = 0;
UpdateKeyPriorityIcon();
}
private void InputOverHkMenuItem_Click(object sender, EventArgs e)
{
Global.Config.Input_Hotkey_OverrideOptions = 1;
UpdateKeyPriorityIcon();
}
private void HkOverInputMenuItem_Click(object sender, EventArgs e)
{
Global.Config.Input_Hotkey_OverrideOptions = 2;
UpdateKeyPriorityIcon();
}
private void GBInSGBMenuItem_Click(object sender, EventArgs e)
{
Global.Config.GB_AsSGB ^= true;
if (!Global.Emulator.IsNull())
{
FlagNeedsReboot();
}
}
private void NesInQuickNESMenuItem_Click(object sender, EventArgs e)
{
Global.Config.NES_InQuickNES ^= true;
if (!Global.Emulator.IsNull())
{
FlagNeedsReboot();
}
}
private void SnesWithSnes9xMenuItem_Click(object sender, EventArgs e)
{
Global.Config.SNES_InSnes9x ^= true;
if (!Global.Emulator.IsNull())
{
FlagNeedsReboot();
}
}
private void N64VideoPluginSettingsMenuItem_Click(object sender, EventArgs e)
{
N64PluginSettingsMenuItem_Click(sender, e);
}
private void SaveConfigMenuItem_Click(object sender, EventArgs e)
{
SaveConfig();
GlobalWin.OSD.AddMessage("Saved settings");
}
private void LoadConfigMenuItem_Click(object sender, EventArgs e)
{
Global.Config = ConfigService.Load<Config>(PathManager.DefaultIniPath);
Global.Config.ResolveDefaults();
GlobalWin.OSD.AddMessage("Config file loaded");
}
#endregion
#region Tools
static bool ToolAvailable<T>()
{
return ServiceInjector.IsAvailable(Global.Emulator.ServiceProvider, typeof(T));
}
private void ToolsSubMenu_DropDownOpened(object sender, EventArgs e)
{
ToolBoxMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["ToolBox"].Bindings;
RamWatchMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Ram Watch"].Bindings;
RamSearchMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Ram Search"].Bindings;
HexEditorMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Hex Editor"].Bindings;
LuaConsoleMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Lua Console"].Bindings;
CheatsMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Cheats"].Bindings;
TAStudioMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["TAStudio"].Bindings;
VirtualPadMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Virtual Pad"].Bindings;
TraceLoggerMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Trace Logger"].Bindings;
TraceLoggerMenuItem.Enabled = ToolAvailable<TraceLogger>();
TAStudioMenuItem.Enabled = ToolAvailable<TAStudio>();
CheatsMenuItem.Enabled = ToolAvailable<Cheats>();
HexEditorMenuItem.Enabled = ToolAvailable<HexEditor>();
RamSearchMenuItem.Enabled = ToolAvailable<RamSearch>();
RamWatchMenuItem.Enabled = ToolAvailable<RamWatch>();
DebuggerMenuItem.Visible = VersionInfo.DeveloperBuild;
DebuggerMenuItem.Enabled = ToolAvailable<GenericDebugger>();
batchRunnerToolStripMenuItem.Visible = VersionInfo.DeveloperBuild;
}
private void ToolBoxMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<ToolBox>();
}
private void RamWatchMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.LoadRamWatch(true);
}
private void RamSearchMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<RamSearch>();
}
private void HexEditorMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<HexEditor>();
}
private void TraceLoggerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<TraceLogger>();
}
private void DebuggerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<GenericDebugger>();
}
private void TAStudioMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<TAStudio>();
}
private void VirtualPadMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<VirtualpadTool>();
}
private void CheatsMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<Cheats>();
}
private void LuaConsoleMenuItem_Click(object sender, EventArgs e)
{
OpenLuaConsole();
}
private void CreateDualGbXmlMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Sound.StopSound();
using (var dlg = new DualGBXMLCreator())
{
var result = dlg.ShowDialog(this);
if (result == DialogResult.OK)
{
GlobalWin.OSD.AddMessage("XML File saved");
}
else
{
GlobalWin.OSD.AddMessage("Dual GB creator aborted");
}
}
GlobalWin.Sound.StartSound();
}
private void batchRunnerToolStripMenuItem_Click(object sender, EventArgs e)
{
new BatchRun().ShowDialog();
}
#endregion
#region NES
private void NESSubMenu_DropDownOpened(object sender, EventArgs e)
{
FDSControlsMenuItem.Enabled = Global.Emulator.BoardName == "FDS";
NESSoundChannelsMenuItem.Enabled = ToolAvailable<NESSoundConfig>();
MovieSettingsMenuItem.Enabled = ToolAvailable<NESSyncSettingsForm>()
&& !Global.MovieSession.Movie.IsActive;
NesControllerSettingsMenuItem.Enabled = ToolAvailable<NesControllerSettings>()
&& !Global.MovieSession.Movie.IsActive;
barcodeReaderToolStripMenuItem.Enabled = ServiceInjector.IsAvailable(Global.Emulator.ServiceProvider, typeof(BarcodeEntry));
}
private void FdsControlsMenuItem_DropDownOpened(object sender, EventArgs e)
{
FdsEjectDiskMenuItem.Enabled = Global.Emulator.BoardName == "FDS";
while (FDSControlsMenuItem.DropDownItems.Count > 1)
{
FDSControlsMenuItem.DropDownItems.RemoveAt(1);
}
for (int i = 0; i < 16; i++)
{
var str = "FDS Insert " + i;
if (Global.Emulator.ControllerDefinition.BoolButtons.Contains(str))
{
FdsInsertDiskMenuAdd("Insert Disk " + i, str, "FDS Disk " + i + " inserted.");
}
}
}
private void NESPPUViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<NesPPU>();
}
private void NESNametableViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<NESNameTableViewer>();
}
private void NESGameGenieCodesMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.LoadGameGenieEc();
}
private void NESGraphicSettingsMenuItem_Click(object sender, EventArgs e)
{
if (Global.Emulator is NES)
new NESGraphicsConfig().ShowDialog(this);
else if (Global.Emulator is QuickNES)
new QuickNesConfig().ShowDialog(this);
}
private void NESSoundChannelsMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<NESSoundConfig>();
}
private void FdsEjectDiskMenuItem_Click(object sender, EventArgs e)
{
if (!Global.MovieSession.Movie.IsPlaying || Global.MovieSession.Movie.IsFinished)
{
Global.ClickyVirtualPadController.Click("FDS Eject");
GlobalWin.OSD.AddMessage("FDS disk ejected.");
}
}
private void NesControllerSettingsMenuItem_Click(object sender, EventArgs e)
{
if (Global.Emulator is NES)
new NesControllerSettings().ShowDialog();
else if (Global.Emulator is QuickNES)
GenericCoreConfig.DoDialog(this, "QuickNES Controller Settings", true, false);
}
private void MovieSettingsMenuItem_Click(object sender, EventArgs e)
{
using (var dlg = new NESSyncSettingsForm())
{
dlg.ShowDialog(this);
}
}
#endregion
#region PCE
private void PCESubMenu_DropDownOpened(object sender, EventArgs e)
{
var s = ((PCEngine)Global.Emulator).GetSettings();
PceControllerSettingsMenuItem.Enabled = !Global.MovieSession.Movie.IsActive;
PCEAlwaysPerformSpriteLimitMenuItem.Checked = s.SpriteLimit;
PCEAlwaysEqualizeVolumesMenuItem.Checked = s.EqualizeVolume;
PCEArcadeCardRewindEnableMenuItem.Checked = s.ArcadeCardRewindHack;
}
private void PceControllerSettingsMenuItem_Click(object sender, EventArgs e)
{
using (var dlg = new PCEControllerConfig())
{
dlg.ShowDialog();
}
}
private void PCEGraphicsSettingsMenuItem_Click(object sender, EventArgs e)
{
new PCEGraphicsConfig().ShowDialog();
}
private void PCEBGViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<PceBgViewer>();
}
private void PceTileViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<PCETileViewer>();
}
private void PceSoundDebuggerToolStripMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<PCESoundDebugger>();
}
private void CodeDataLoggerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<PCECDL>();
}
private void PCEAlwaysPerformSpriteLimitMenuItem_Click(object sender, EventArgs e)
{
var s = ((PCEngine)Global.Emulator).GetSettings();
s.SpriteLimit ^= true;
PutCoreSettings(s);
}
private void PCEAlwaysEqualizeVolumesMenuItem_Click(object sender, EventArgs e)
{
var s = ((PCEngine)Global.Emulator).GetSettings();
s.EqualizeVolume ^= true;
PutCoreSettings(s);
}
private void PCEArcadeCardRewindEnableMenuItem_Click(object sender, EventArgs e)
{
var s = ((PCEngine)Global.Emulator).GetSettings();
s.ArcadeCardRewindHack ^= true;
PutCoreSettings(s);
}
#endregion
#region SMS
private void SMSSubMenu_DropDownOpened(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
var ss = ((SMS)Global.Emulator).GetSyncSettings();
SMSregionExportToolStripMenuItem.Checked = ss.ConsoleRegion == "Export";
SMSregionJapanToolStripMenuItem.Checked = ss.ConsoleRegion == "Japan";
SMSregionAutoToolStripMenuItem.Checked = ss.ConsoleRegion == "Auto";
SMSdisplayNtscToolStripMenuItem.Checked = ss.DisplayType == "NTSC";
SMSdisplayPalToolStripMenuItem.Checked = ss.DisplayType == "PAL";
SMSdisplayAutoToolStripMenuItem.Checked = ss.DisplayType == "Auto";
SMSenableBIOSToolStripMenuItem.Checked = ss.UseBIOS;
SMSEnableFMChipMenuItem.Checked = ss.EnableFM;
SMSOverclockMenuItem.Checked = ss.AllowOverlock;
SMSForceStereoMenuItem.Checked = s.ForceStereoSeparation;
SMSSpriteLimitMenuItem.Checked = s.SpriteLimit;
SMSFix3DGameDisplayToolStripMenuItem.Checked = s.Fix3D;
ShowClippedRegionsMenuItem.Checked = s.ShowClippedRegions;
HighlightActiveDisplayRegionMenuItem.Checked = s.HighlightActiveDisplayRegion;
SMSEnableFMChipMenuItem.Visible =
SMSFix3DGameDisplayToolStripMenuItem.Visible =
SMSenableBIOSToolStripMenuItem.Visible =
Global.Game.System == "SMS";
SMSOverclockMenuItem.Visible =
SMSForceStereoMenuItem.Visible =
SMSdisplayToolStripMenuItem.Visible =
Global.Game.System != "GG";
ShowClippedRegionsMenuItem.Visible =
HighlightActiveDisplayRegionMenuItem.Visible =
GGGameGenieMenuItem.Visible =
Global.Game.System == "GG";
SMSOverclockMenuItem.Visible =
SMSVDPViewerToolStripMenuItem.Visible =
Global.Game.System != "SG";
}
private void SMS_RegionExport_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.ConsoleRegion = "Export";
PutCoreSyncSettings(ss);
}
private void SMS_RegionJapan_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.ConsoleRegion = "Japan";
PutCoreSyncSettings(ss);
}
private void SMS_RegionAuto_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.ConsoleRegion = "Auto";
PutCoreSyncSettings(ss);
}
private void SMS_DisplayNTSC_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.DisplayType = "NTSC";
PutCoreSyncSettings(ss);
}
private void SMS_DisplayPAL_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.DisplayType = "PAL";
PutCoreSyncSettings(ss);
}
private void SMS_DisplayAuto_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.DisplayType = "Auto";
PutCoreSyncSettings(ss);
}
private void SMS_BIOS_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.UseBIOS ^= true;
PutCoreSyncSettings(ss);
}
private void SMSEnableFMChipMenuItem_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.EnableFM ^= true;
PutCoreSyncSettings(ss);
}
private void SMSOverclockMenuItem_Click(object sender, EventArgs e)
{
var ss = ((SMS)Global.Emulator).GetSyncSettings();
ss.AllowOverlock ^= true;
PutCoreSyncSettings(ss);
}
private void SMSForceStereoMenuItem_Click(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
s.ForceStereoSeparation ^= true;
PutCoreSettings(s);
}
private void SMSSpriteLimitMenuItem_Click(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
s.SpriteLimit ^= true;
PutCoreSettings(s);
}
private void SMSFix3DDisplayMenuItem_Click(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
s.Fix3D ^= true;
PutCoreSettings(s);
}
private void ShowClippedRegionsMenuItem_Click(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
s.ShowClippedRegions ^= true;
PutCoreSettings(s);
}
private void HighlightActiveDisplayRegionMenuItem_Click(object sender, EventArgs e)
{
var s = ((SMS)Global.Emulator).GetSettings();
s.HighlightActiveDisplayRegion ^= true;
PutCoreSettings(s);
}
private void SMSGraphicsSettingsMenuItem_Click(object sender, EventArgs e)
{
new SMSGraphicsConfig().ShowDialog();
}
private void GGGameGenieMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.LoadGameGenieEc();
}
private void SmsVdpViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<SmsVDPViewer>();
}
#endregion
#region TI83
private void TI83SubMenu_DropDownOpened(object sender, EventArgs e)
{
AutoloadKeypadMenuItem.Checked = Global.Config.TI83autoloadKeyPad;
}
private void KeypadMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<TI83KeyPad>();
}
private void AutoloadKeypadMenuItem_Click(object sender, EventArgs e)
{
Global.Config.TI83autoloadKeyPad ^= true;
}
private void LoadTIFileMenuItem_Click(object sender, EventArgs e)
{
var OFD = new OpenFileDialog();
if (OFD.ShowDialog() == DialogResult.OK)
{
try
{
(Global.Emulator as TI83).LinkPort.SendFileToCalc(File.OpenRead(OFD.FileName), true);
}
catch (IOException ex)
{
var Message = String.Format("Invalid file format. Reason: {0} \nForce transfer? This may cause the calculator to crash.", ex.Message);
if (MessageBox.Show(Message, "Upload Failed", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
{
(Global.Emulator as TI83).LinkPort.SendFileToCalc(File.OpenRead(OFD.FileName), false);
}
}
}
}
private void paletteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (new TI83PaletteConfig().ShowDialog() == DialogResult.OK)
{
GlobalWin.OSD.AddMessage("Palette settings saved");
}
else
{
GlobalWin.OSD.AddMessage("Palette config aborted");
}
}
#endregion
#region Atari
private void AtariSubMenu_DropDownOpened(object sender, EventArgs e)
{
}
private void AtariSettingsToolStripMenuItem_Click(object sender, EventArgs e)
{
GenericCoreConfig.DoDialog(this, "Atari 2600 Settings");
}
#endregion
#region GB
private void GBSubMenu_DropDownOpened(object sender, EventArgs e)
{
LoadGBInSGBMenuItem.Checked = Global.Config.GB_AsSGB;
}
private void GBCoreSettingsMenuItem_Click(object sender, EventArgs e)
{
config.GB.GBPrefs.DoGBPrefsDialog(this);
}
private void GBForceDMGMenuItem_Click(object sender, EventArgs e)
{
var s = ((Gameboy)Global.Emulator).GetSyncSettings();
s.ForceDMG ^= true;
PutCoreSyncSettings(s);
}
private void GBAInCGBModeMenuItem_Click(object sender, EventArgs e)
{
var s = ((Gameboy)Global.Emulator).GetSyncSettings();
s.GBACGB ^= true;
PutCoreSyncSettings(s);
}
private void GBMulticartCompatibilityMenuItem_Click(object sender, EventArgs e)
{
var s = ((Gameboy)Global.Emulator).GetSyncSettings();
s.MulticartCompat ^= true;
PutCoreSyncSettings(s);
}
private void GBPaletteConfigMenuItem_Click(object sender, EventArgs e)
{
var gb = Global.Emulator as Gameboy;
if (gb.IsCGBMode())
CGBColorChooserForm.DoCGBColorChooserFormDialog(this);
else
ColorChooserForm.DoColorChooserFormDialog(this);
}
private void LoadGBInSGBMenuItem_Click(object sender, EventArgs e)
{
SnesGBInSGBMenuItem_Click(sender, e);
}
private void GBGPUViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<GBGPUView>();
}
private void GBGameGenieMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.LoadGameGenieEc();
}
#endregion
#region GBA
private void GbaGpuViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<GBAGPUView>();
}
#endregion
#region SNES
private void SNESSubMenu_DropDownOpened(object sender, EventArgs e)
{
if ((Global.Emulator as LibsnesCore).IsSGB)
{
SnesGBInSGBMenuItem.Visible = true;
SnesGBInSGBMenuItem.Checked = Global.Config.GB_AsSGB;
}
else
{
SnesGBInSGBMenuItem.Visible = false;
}
}
private void SNESDisplayMenuItem_DropDownOpened(object sender, EventArgs e)
{
var s = ((LibsnesCore)Global.Emulator).GetSettings();
SnesBg1MenuItem.Checked = s.ShowBG1_1;
SnesBg2MenuItem.Checked = s.ShowBG2_1;
SnesBg3MenuItem.Checked = s.ShowBG3_1;
SnesBg4MenuItem.Checked = s.ShowBG4_1;
SnesObj1MenuItem.Checked = s.ShowOBJ_0;
SnesObj2MenuItem.Checked = s.ShowOBJ_1;
SnesObj3MenuItem.Checked = s.ShowOBJ_2;
SnesObj4MenuItem.Checked = s.ShowOBJ_3;
SnesBg1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle BG 1"].Bindings;
SnesBg2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle BG 2"].Bindings;
SnesBg3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle BG 3"].Bindings;
SnesBg4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle BG 4"].Bindings;
SnesObj1MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle OBJ 1"].Bindings;
SnesObj2MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle OBJ 2"].Bindings;
SnesObj3MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle OBJ 3"].Bindings;
SnesObj4MenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Toggle OBJ 4"].Bindings;
}
private void SnesBg1MenuItem_Click(object sender, EventArgs e)
{
SNES_ToggleBG1();
}
private void SnesBg2MenuItem_Click(object sender, EventArgs e)
{
SNES_ToggleBG2();
}
private void SnesBg3MenuItem_Click(object sender, EventArgs e)
{
SNES_ToggleBG3();
}
private void SnesBg4MenuItem_Click(object sender, EventArgs e)
{
SNES_ToggleBG4();
}
private void SnesObj1MenuItem_Click(object sender, EventArgs e)
{
this.SNES_ToggleObj1();
}
private void SnesObj2MenuItem_Click(object sender, EventArgs e)
{
this.SNES_ToggleObj2();
}
private void SnesObj3MenuItem_Click(object sender, EventArgs e)
{
SNES_ToggleOBJ3();
}
private void SnesObj4MenuItem_Click(object sender, EventArgs e)
{
SNES_ToggleOBJ4();
}
private void SnesGfxDebuggerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<SNESGraphicsDebugger>();
}
private void SnesGBInSGBMenuItem_Click(object sender, EventArgs e)
{
Global.Config.GB_AsSGB ^= true;
FlagNeedsReboot();
}
private void SnesGameGenieMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.LoadGameGenieEc();
}
private void SnesOptionsMenuItem_Click(object sender, EventArgs e)
{
SNESOptions.DoSettingsDialog(this);
}
private void PSXOptionsMenuItem_Click(object sender, EventArgs e)
{
var result = PSXOptions.DoSettingsDialog(this);
if (result == DialogResult.OK)
{
FrameBufferResized();
}
}
private void PSXDiscControlsMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<VirtualpadTool>().ScrollToPadSchema("Console");
}
private void FlushSaveRAMMenuItem_Click(object sender, EventArgs e)
{
SaveRam();
}
#endregion
#region Coleco
private void ColecoSubMenu_DropDownOpened(object sender, EventArgs e)
{
var ss = ((ColecoVision)Global.Emulator).GetSyncSettings();
ColecoSkipBiosMenuItem.Checked = ss.SkipBiosIntro;
}
private void ColecoSkipBiosMenuItem_Click(object sender, EventArgs e)
{
var ss = ((ColecoVision)Global.Emulator).GetSyncSettings();
ss.SkipBiosIntro ^= true;
PutCoreSyncSettings(ss);
}
#endregion
#region N64
private void N64SubMenu_DropDownOpened(object sender, EventArgs e)
{
N64PluginSettingsMenuItem.Enabled =
N64ControllerSettingsMenuItem.Enabled =
N64ExpansionSlotMenuItem.Enabled =
!Global.MovieSession.Movie.IsActive;
N64CircularAnalogRangeMenuItem.Checked = Global.Config.N64UseCircularAnalogConstraint;
var s = ((N64)Global.Emulator).GetSettings();
MupenStyleLagMenuItem.Checked = s.UseMupenStyleLag;
//var ss = (N64SyncSettings)Global.Emulator.GetSyncSettings();
//N64ExpansionSlotMenuItem.Checked = !ss.DisableExpansionSlot;
N64ExpansionSlotMenuItem.Checked = (Global.Emulator as N64).UsingExpansionSlot;
N64ExpansionSlotMenuItem.Enabled = !(Global.Emulator as N64).IsOverridingUserExpansionSlotSetting;
}
private void N64PluginSettingsMenuItem_Click(object sender, EventArgs e)
{
if (new N64VideoPluginconfig().ShowDialog() == DialogResult.OK)
{
if (Global.Emulator.IsNull())
{
GlobalWin.OSD.AddMessage("Plugin settings saved");
}
else
{
// Do nothing, Reboot is being flagged already if they chaned anything
}
}
else
{
GlobalWin.OSD.AddMessage("Plugin settings aborted");
}
}
private void N64ControllerSettingsMenuItem_Click(object sender, EventArgs e)
{
if (new N64ControllersSetup().ShowDialog() == DialogResult.OK)
{
GlobalWin.MainForm.FlagNeedsReboot();
GlobalWin.OSD.AddMessage("Controller settings saved but a core reboot is required");
}
else
{
GlobalWin.OSD.AddMessage("Controller settings aborted");
}
}
private void N64CircularAnalogRangeMenuItem_Click(object sender, EventArgs e)
{
Global.Config.N64UseCircularAnalogConstraint ^= true;
}
private void MupenStyleLagMenuItem_Click(object sender, EventArgs e)
{
var n64 = (N64)Global.Emulator;
var s = n64.GetSettings();
s.UseMupenStyleLag ^= true;
n64.PutSettings(s);
}
private void N64ExpansionSlotMenuItem_Click(object sender, EventArgs e)
{
var n64 = (N64)Global.Emulator;
var ss = n64.GetSyncSettings();
ss.DisableExpansionSlot ^= true;
n64.PutSyncSettings(ss);
FlagNeedsReboot();
}
#endregion
#region Saturn
private void SaturnPreferencesMenuItem_Click(object sender, EventArgs e)
{
GenericCoreConfig.DoDialog(this, "Saturn Settings");
/* -- delete me, out of date
using (var dlg = new SaturnPrefs())
{
dlg.ShowDialog(this);
}
* */
}
#endregion
#region DGB
private void DGBsettingsToolStripMenuItem_Click(object sender, EventArgs e)
{
config.GB.DGBPrefs.DoDGBPrefsDialog(this);
}
#endregion
#region GEN
private void GenVdpViewerMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<GenVDPViewer>();
}
private void GenesisSettingsMenuItem_Click(object sender, EventArgs e)
{
GenericCoreConfig.DoDialog(this, "Genesis Settings");
}
#endregion
#region Wondersawn
private void WondersawnSettingsMenuItem_Click(object sender, EventArgs e)
{
GenericCoreConfig.DoDialog(this, "WonderSwan Settings");
}
#endregion
#region Help
private void OnlineHelpMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://tasvideos.org/BizHawk.html");
}
private void ForumsMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://tasvideos.org/forum/viewforum.php?f=64");
}
private void AboutMenuItem_Click(object sender, EventArgs e)
{
if (VersionInfo.DeveloperBuild)
{
new AboutBox().ShowDialog();
}
else
{
new BizBox().ShowDialog();
}
}
#endregion
#region Context Menu
private void MainFormContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
_wasPaused = EmulatorPaused;
_didMenuPause = true;
PauseEmulator();
OpenRomContextMenuItem.Visible = Global.Emulator.IsNull() || _inFullscreen;
bool showMenuVisible = _inFullscreen;
if (!MainMenuStrip.Visible) showMenuVisible = true; //need to always be able to restore this as an emergency measure
if (_chromeless) showMenuVisible = true; //I decided this was always possible in chromeless mode, we'll see what they think
ShowMenuContextMenuItem.Visible =
ShowMenuContextMenuSeparator.Visible =
showMenuVisible;
LoadLastRomContextMenuItem.Visible = Global.Emulator.IsNull();
StopAVContextMenuItem.Visible = _currAviWriter != null;
ContextSeparator_AfterMovie.Visible =
ContextSeparator_AfterUndo.Visible =
ScreenshotContextMenuItem.Visible =
CloseRomContextMenuItem.Visible =
UndoSavestateContextMenuItem.Visible =
!Global.Emulator.IsNull();
RecordMovieContextMenuItem.Visible =
PlayMovieContextMenuItem.Visible =
LoadLastMovieContextMenuItem.Visible =
!Global.Emulator.IsNull() && !Global.MovieSession.Movie.IsActive;
RestartMovieContextMenuItem.Visible =
StopMovieContextMenuItem.Visible =
ViewSubtitlesContextMenuItem.Visible =
ViewCommentsContextMenuItem.Visible =
SaveMovieContextMenuItem.Visible =
Global.MovieSession.Movie.IsActive;
BackupMovieContextMenuItem.Visible = Global.MovieSession.Movie.IsActive;
StopNoSaveContextMenuItem.Visible = Global.MovieSession.Movie.IsActive && Global.MovieSession.Movie.Changes;
AddSubtitleContextMenuItem.Visible = !Global.Emulator.IsNull() && Global.MovieSession.Movie.IsActive && !Global.MovieSession.ReadOnly;
ConfigContextMenuItem.Visible = _inFullscreen;
ClearSRAMContextMenuItem.Visible = File.Exists(PathManager.SaveRamPath(Global.Game));
ContextSeparator_AfterROM.Visible = OpenRomContextMenuItem.Visible || LoadLastRomContextMenuItem.Visible;
LoadLastRomContextMenuItem.Enabled = !Global.Config.RecentRoms.Empty;
LoadLastMovieContextMenuItem.Enabled = !Global.Config.RecentMovies.Empty;
if (Global.MovieSession.Movie.IsActive)
{
if (Global.MovieSession.ReadOnly)
{
ViewSubtitlesContextMenuItem.Text = "View Subtitles";
ViewCommentsContextMenuItem.Text = "View Comments";
}
else
{
ViewSubtitlesContextMenuItem.Text = "Edit Subtitles";
ViewCommentsContextMenuItem.Text = "Edit Comments";
}
}
var file = new FileInfo(
PathManager.SaveStatePrefix(Global.Game) +
".QuickSave" +
Global.Config.SaveSlot +
".State.bak"
);
if (file.Exists)
{
UndoSavestateContextMenuItem.Enabled = true;
if (_stateSlots.IsRedo(Global.Config.SaveSlot))
{
UndoSavestateContextMenuItem.Text = "Redo Save to slot " + Global.Config.SaveSlot;
UndoSavestateContextMenuItem.Image = Properties.Resources.redo;
}
else
{
UndoSavestateContextMenuItem.Text = "Undo Save to slot " + Global.Config.SaveSlot;
UndoSavestateContextMenuItem.Image = Properties.Resources.undo;
}
}
else
{
UndoSavestateContextMenuItem.Enabled = false;
UndoSavestateContextMenuItem.Text = "Undo Savestate";
UndoSavestateContextMenuItem.Image = Properties.Resources.undo;
}
ShowMenuContextMenuItem.Text = MainMenuStrip.Visible ? "Hide Menu" : "Show Menu";
}
private void MainFormContextMenu_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
if (!_wasPaused)
{
UnpauseEmulator();
}
}
private void SavestateTypeContextSubMenu_DropDownOpened(object sender, EventArgs e)
{
SavestateTypeDefaultContextMenuItem.Checked = false;
SavestateBinaryContextMenuItem.Checked = false;
SavestateTextContextMenuItem.Checked = false;
switch (Global.Config.SaveStateType)
{
case Config.SaveStateTypeE.Binary: SavestateBinaryContextMenuItem.Checked = true; break;
case Config.SaveStateTypeE.Text: SavestateTextContextMenuItem.Checked = true; break;
case Config.SaveStateTypeE.Default: SavestateTypeDefaultContextMenuItem.Checked = true; break;
}
}
private void DisplayConfigMenuItem_Click(object sender, EventArgs e)
{
var result = new config.DisplayConfigLite().ShowDialog();
if (result == DialogResult.OK)
{
FrameBufferResized();
SynchChrome();
}
}
private void CoreSelectionContextSubMenu_DropDownOpened(object sender, EventArgs e)
{
GBInSGBContextMenuItem.Checked = Global.Config.GB_AsSGB;
NesInQuickNESContextMenuItem.Checked = Global.Config.NES_InQuickNES;
}
private void LoadLastRomContextMenuItem_Click(object sender, EventArgs e)
{
LoadRomFromRecent(Global.Config.RecentRoms.MostRecent);
}
private void LoadLastMovieContextMenuItem_Click(object sender, EventArgs e)
{
LoadMoviesFromRecent(Global.Config.RecentMovies.MostRecent);
}
private void BackupMovieContextMenuItem_Click(object sender, EventArgs e)
{
Global.MovieSession.Movie.SaveBackup();
GlobalWin.OSD.AddMessage("Backup movie saved.");
}
private void ViewSubtitlesContextMenuItem_Click(object sender, EventArgs e)
{
if (Global.MovieSession.Movie.IsActive)
{
var form = new EditSubtitlesForm { ReadOnly = Global.MovieSession.ReadOnly };
form.GetMovie(Global.MovieSession.Movie);
form.ShowDialog();
}
}
private void AddSubtitleContextMenuItem_Click(object sender, EventArgs e)
{
//TODO: rethink this?
var subForm = new SubtitleMaker();
subForm.DisableFrame();
int index = -1;
var sub = new Subtitle();
for (int x = 0; x < Global.MovieSession.Movie.Subtitles.Count; x++)
{
sub = Global.MovieSession.Movie.Subtitles[x];
if (Global.Emulator.Frame == sub.Frame)
{
index = x;
break;
}
}
if (index < 0)
{
sub = new Subtitle { Frame = Global.Emulator.Frame };
}
subForm.Sub = sub;
if (subForm.ShowDialog() == DialogResult.OK)
{
if (index >= 0)
{
Global.MovieSession.Movie.Subtitles.RemoveAt(index);
}
Global.MovieSession.Movie.Subtitles.Add(subForm.Sub);
}
}
private void ViewCommentsContextMenuItem_Click(object sender, EventArgs e)
{
if (Global.MovieSession.Movie.IsActive)
{
var form = new EditCommentsForm();
form.GetMovie(Global.MovieSession.Movie);
form.ShowDialog();
}
}
private void UndoSavestateContextMenuItem_Click(object sender, EventArgs e)
{
_stateSlots.SwapBackupSavestate(
PathManager.SaveStatePrefix(Global.Game) +
".QuickSave" +
Global.Config.SaveSlot +
".State"
);
GlobalWin.OSD.AddMessage("Save slot " + Global.Config.SaveSlot + " restored.");
}
private void ClearSRAMContextMenuItem_Click(object sender, EventArgs e)
{
CloseRom(clearSram: true);
}
private void ShowMenuContextMenuItem_Click(object sender, EventArgs e)
{
MainMenuStrip.Visible ^= true;
FrameBufferResized();
}
#endregion
#region Status Bar
private void DumpStatusButton_Click(object sender, EventArgs e)
{
string details = Global.Emulator.CoreComm.RomStatusDetails;
if (!String.IsNullOrEmpty(details))
{
GlobalWin.Sound.StopSound();
LogWindow.ShowReport("Dump Status Report", details, this);
GlobalWin.Sound.StartSound();
}
}
private void SlotStatusButtons_MouseUp(object sender, MouseEventArgs e)
{
int slot = 0;
if (sender == Slot1StatusButton) slot = 1;
if (sender == Slot2StatusButton) slot = 2;
if (sender == Slot3StatusButton) slot = 3;
if (sender == Slot4StatusButton) slot = 4;
if (sender == Slot5StatusButton) slot = 5;
if (sender == Slot6StatusButton) slot = 6;
if (sender == Slot7StatusButton) slot = 7;
if (sender == Slot8StatusButton) slot = 8;
if (sender == Slot9StatusButton) slot = 9;
if (sender == Slot0StatusButton) slot = 0;
if (e.Button == MouseButtons.Left)
{
if (_stateSlots.HasSlot(slot))
{
LoadQuickSave("QuickSave" + slot);
}
}
else if (e.Button == MouseButtons.Right)
{
SaveQuickSave("QuickSave" + slot);
}
}
private void KeyPriorityStatusLabel_Click(object sender, EventArgs e)
{
switch (Global.Config.Input_Hotkey_OverrideOptions)
{
default:
case 0:
Global.Config.Input_Hotkey_OverrideOptions = 1;
break;
case 1:
Global.Config.Input_Hotkey_OverrideOptions = 2;
break;
case 2:
Global.Config.Input_Hotkey_OverrideOptions = 0;
break;
}
UpdateKeyPriorityIcon();
}
private void FreezeStatus_Click(object sender, EventArgs e)
{
if (CheatStatusButton.Visible)
{
GlobalWin.Tools.Load<Cheats>();
}
}
private void ProfileFirstBootLabel_Click(object sender, EventArgs e)
{
//We do not check if the user is actually setting a profile here.
//This is intentional.
var profileForm = new ProfileConfig();
profileForm.ShowDialog();
Global.Config.FirstBoot = false;
ProfileFirstBootLabel.Visible = false;
}
#endregion
#region Form Events
private void MainForm_Activated(object sender, EventArgs e)
{
if (!Global.Config.RunInBackground)
{
if (!_wasPaused)
{
UnpauseEmulator();
}
_wasPaused = false;
}
}
private void MainForm_Deactivate(object sender, EventArgs e)
{
if (!Global.Config.RunInBackground)
{
if (EmulatorPaused)
{
_wasPaused = true;
}
PauseEmulator();
}
}
private void MainForm_Enter(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
}
public void MainForm_MouseClick(object sender, MouseEventArgs e)
{
if (Global.Config.ShowContextMenu && e.Button == MouseButtons.Right)
{
MainFormContextMenu.Show(
PointToScreen(new Point(e.X, e.Y + MainformMenu.Height))
);
}
}
private void MainForm_Resize(object sender, EventArgs e)
{
GlobalWin.PresentationPanel.Resized = true;
}
private void MainForm_Shown(object sender, EventArgs e)
{
HandlePlatformMenus();
}
protected override void OnClosed(EventArgs e)
{
_exit = true;
base.OnClosed(e);
}
private void MainformMenu_Leave(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
}
private void MainformMenu_MenuActivate(object sender, EventArgs e)
{
HandlePlatformMenus();
if (Global.Config.PauseWhenMenuActivated)
{
_wasPaused = EmulatorPaused;
_didMenuPause = true;
PauseEmulator();
}
}
private void MainformMenu_MenuDeactivate(object sender, EventArgs e)
{
GlobalWin.DisplayManager.NeedsToPaint = true;
if (!_wasPaused)
{
UnpauseEmulator();
}
}
private static void FormDragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None;
}
private void FormDragDrop(object sender, DragEventArgs e)
{
try
{
FormDragDrop_internal(sender, e);
}
catch (Exception ex)
{
MessageBox.Show("Exception on drag and drop:\n" + ex);
}
}
private void FormDragDrop_internal(object sender, DragEventArgs e)
{
var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
var isLua = false;
foreach (var path in filePaths)
{
var extension = Path.GetExtension(path);
if (extension != null && extension.ToUpper() == ".LUA")
{
OpenLuaConsole();
if (GlobalWin.Tools.Has<LuaConsole>())
{
GlobalWin.Tools.LuaConsole.LoadLuaFile(path);
}
isLua = true;
}
}
if (isLua)
{
return;
}
var ext = Path.GetExtension(filePaths[0]) ?? string.Empty;
if (ext.ToUpper() == ".LUASES")
{
OpenLuaConsole();
if (GlobalWin.Tools.Has<LuaConsole>())
{
GlobalWin.Tools.LuaConsole.LoadLuaSession(filePaths[0]);
}
}
else if (MovieService.IsValidMovieExtension(ext))
{
if (!Global.MovieSession.Movie.IsActive)
{
StartNewMovie(MovieService.Get(filePaths[0]), false);
}
}
else if (ext.ToUpper() == ".STATE")
{
LoadState(filePaths[0], Path.GetFileName(filePaths[0]));
}
else if (ext.ToUpper() == ".CHT")
{
Global.CheatList.Load(filePaths[0], false);
GlobalWin.Tools.Load<Cheats>();
}
else if (ext.ToUpper() == ".WCH")
{
GlobalWin.Tools.LoadRamWatch(true);
(GlobalWin.Tools.Get<RamWatch>() as RamWatch).LoadWatchFile(new FileInfo(filePaths[0]), false);
}
else if (ext.ToUpper() == ".CDL" && Global.Emulator is PCEngine)
{
GlobalWin.Tools.Load<PCECDL>();
(GlobalWin.Tools.Get<PCECDL>() as PCECDL).LoadFile(filePaths[0]);
}
else if (MovieImport.IsValidMovieExtension(Path.GetExtension(filePaths[0])))
{
if (!Global.MovieSession.Movie.IsActive)
{
//tries to open a legacy movie format by importing it
if (CurrentlyOpenRom == null)
{
OpenRom();
}
else
{
LoadRom(CurrentlyOpenRom);
}
string errorMsg;
string warningMsg;
var movie = MovieImport.ImportFile(filePaths[0], out errorMsg, out warningMsg);
if (!string.IsNullOrEmpty(errorMsg))
{
MessageBox.Show(errorMsg, "Conversion error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
// fix movie extension to something palatable for these purposes.
// for instance, something which doesnt clobber movies you already may have had.
// i'm evenly torn between this, and a file in %TEMP%, but since we dont really have a way to clean up this tempfile, i choose this:
StartNewMovie(movie, false);
}
GlobalWin.OSD.AddMessage(warningMsg);
}
}
else
{
LoadRom(filePaths[0]);
}
}
#endregion
}
}