Add a "Don't ask me again" checkbox on the Performance core recording nag

This commit is contained in:
adelikat 2014-06-14 02:23:13 +00:00
parent e54d68edb8
commit 2774e9c252
6 changed files with 886 additions and 5 deletions

View File

@ -55,6 +55,7 @@ namespace BizHawk.Client.Common
public string FFMpegPath = "%exe%/dll/ffmpeg.exe";
// General Client Settings
public bool DontAskPerformanceCoreRecordingNag = false;
public int Input_Hotkey_OverrideOptions = 0;
public bool StackOSDMessages = true;
public int TargetZoomFactor = 2;

View File

@ -433,6 +433,12 @@
<Compile Include="CustomControls\MiscControls.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="CustomControls\MsgBox.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="CustomControls\MsgBox.designer.cs">
<DependentUpon>MsgBox.cs</DependentUpon>
</Compile>
<Compile Include="CustomControls\QuickProgressPopup.cs">
<SubType>Form</SubType>
</Compile>
@ -1131,6 +1137,9 @@
<EmbeddedResource Include="CustomControls\InputConfigBase.resx">
<DependentUpon>InputConfigBase.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CustomControls\MsgBox.resx">
<DependentUpon>MsgBox.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CustomControls\QuickProgressPopup.resx">
<DependentUpon>QuickProgressPopup.cs</DependentUpon>
</EmbeddedResource>

View File

@ -0,0 +1,351 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// http://www.codeproject.com/Articles/154680/A-customizable-NET-WinForms-Message-Box
namespace BizHawk.Client.EmuHawk
{
/// <summary>
/// A customizable Dialog box with 3 buttons, custom icon, and checkbox.
/// </summary>
partial class MsgBox : Form
{
/// <summary>
/// Create a new instance of the dialog box with a message and title.
/// </summary>
/// <param name="message">Message text.</param>
/// <param name="title">Dialog Box title.</param>
public MsgBox(string message, string title)
: this(message, title, MessageBoxIcon.None)
{
}
/// <summary>
/// Create a new instance of the dialog box with a message and title and a standard windows messagebox icon.
/// </summary>
/// <param name="message">Message text.</param>
/// <param name="title">Dialog Box title.</param>
/// <param name="icon">Standard system messagebox icon.</param>
public MsgBox(string message, string title, MessageBoxIcon icon)
: this(message, title, getMessageBoxIcon(icon))
{
}
/// <summary>
/// Create a new instance of the dialog box with a message and title and a custom windows icon.
/// </summary>
/// <param name="message">Message text.</param>
/// <param name="title">Dialog Box title.</param>
/// <param name="icon">Custom icon.</param>
public MsgBox(string message, string title, Icon icon)
{
InitializeComponent();
this.messageLbl.Text = message;
this.Text = title;
this.m_sysIcon = icon;
if (this.m_sysIcon == null)
this.messageLbl.Location = new System.Drawing.Point(FORM_X_MARGIN, FORM_Y_MARGIN);
}
public void SetMessageToAutoSize()
{
this.messageLbl.AutoSize = true;
this.messageLbl.MaximumSize = new Size(this.MaximumSize.Width - this.m_sysIcon.Width - 25, this.MaximumSize.Height);
}
/// <summary>
/// Get system icon for MessageBoxIcon.
/// </summary>
/// <param name="icon">The MessageBoxIcon value.</param>
/// <returns>SystemIcon type Icon.</returns>
static Icon getMessageBoxIcon(MessageBoxIcon icon)
{
switch (icon)
{
case MessageBoxIcon.Asterisk:
return SystemIcons.Asterisk;
case MessageBoxIcon.Error:
return SystemIcons.Error;
case MessageBoxIcon.Exclamation:
return SystemIcons.Exclamation;
case MessageBoxIcon.Question:
return SystemIcons.Question;
default:
return null;
}
}
#region Setup API
/// <summary>
/// Min set width.
/// </summary>
int m_minWidth;
/// <summary>
/// Min set height.
/// </summary>
int m_minHeight;
/// <summary>
/// Sets the min size of the dialog box. If the text or button row needs more size then the dialog box will size to fit the text.
/// </summary>
/// <param name="width">Min width value.</param>
/// <param name="height">Min height value.</param>
public void SetMinSize(int width, int height)
{
m_minWidth = width;
m_minHeight = height;
}
/// <summary>
/// Create up to 3 buttons with no DialogResult values.
/// </summary>
/// <param name="names">Array of button names. Must of length 1-3.</param>
public void SetButtons(params string[] names)
{
DialogResult[] drs = new DialogResult[names.Length];
for (int i = 0; i < names.Length; i++)
drs[i] = DialogResult.None;
this.SetButtons(names, drs);
}
/// <summary>
/// Create up to 3 buttons with given DialogResult values.
/// </summary>
/// <param name="names">Array of button names. Must of length 1-3.</param>
/// <param name="results">Array of DialogResult values. Must be same length as names.</param>
public void SetButtons(string[] names, DialogResult[] results)
{
this.SetButtons(names, results, 1);
}
/// <summary>
/// Create up to 3 buttons with given DialogResult values.
/// </summary>
/// <param name="names">Array of button names. Must of length 1-3.</param>
/// <param name="results">Array of DialogResult values. Must be same length as names.</param>
/// <param name="def">Default Button number. Must be 1-3.</param>
public void SetButtons(string[] names, DialogResult[] results, int def)
{
if (names == null)
throw new ArgumentNullException("btnText", "Button Text is null");
int count = names.Length;
if (count < 1 || count > 3)
throw new ArgumentException("Invalid number of buttons. Must be between 1 and 3.");
//---- Set Button 1
m_minButtonRowWidth += setButtonParams(btn1, names[0], def == 1 ? 1 : 2, results[0]);
//---- Set Button 2
if (count > 1)
{
m_minButtonRowWidth += setButtonParams(btn2, names[1], def == 2 ? 1 : 3, results[1]) + BUTTON_SPACE;
}
//---- Set Button 3
if (count > 2)
{
m_minButtonRowWidth += setButtonParams(btn3, names[2], def == 3 ? 1 : 4, results[2]) + BUTTON_SPACE;
}
}
/// <summary>
/// The min required width of the button and checkbox row. Sum of button widths + checkbox width + margins.
/// </summary>
int m_minButtonRowWidth;
/// <summary>
/// Sets button text and returns the width.
/// </summary>
/// <param name="btn">Button object.</param>
/// <param name="text">Text of the button.</param>
/// <param name="tab">TabIndex of the button.</param>
/// <param name="dr">DialogResult of the button.</param>
/// <returns>Width of the button.</returns>
static int setButtonParams(Button btn, string text, int tab, DialogResult dr)
{
btn.Text = text;
btn.Visible = true;
btn.DialogResult = dr;
btn.TabIndex = tab;
return btn.Size.Width;
}
/// <summary>
/// Enables the checkbox. By default the checkbox is unchecked.
/// </summary>
/// <param name="text">Text of the checkbox.</param>
public void SetCheckbox(string text)
{
this.SetCheckbox(text, false);
}
/// <summary>
/// Enables the checkbox and the default checked state.
/// </summary>
/// <param name="text">Text of the checkbox.</param>
/// <param name="chcked">Default checked state of the box.</param>
public void SetCheckbox(string text, bool chcked)
{
this.chkBx.Visible = true;
this.chkBx.Text = text;
this.chkBx.Checked = chcked;
this.m_minButtonRowWidth += this.chkBx.Size.Width + CHECKBOX_SPACE;
}
#endregion
#region Sizes and Locations
private void DialogBox_Load(object sender, EventArgs e)
{
if (!btn1.Visible)
this.SetButtons(new string[] { "OK" }, new DialogResult[] { DialogResult.OK });
m_minButtonRowWidth += 2 * FORM_X_MARGIN; //add margin to the ends
this.setDialogSize();
//this.setButtonRowLocations();
}
const int FORM_Y_MARGIN = 10;
const int FORM_X_MARGIN = 16;
const int BUTTON_SPACE = 5;
const int CHECKBOX_SPACE = 15;
const int TEXT_Y_MARGIN = 30;
/// <summary>
/// Auto fits the dialog box to fit the text and the buttons.
/// </summary>
void setDialogSize()
{
int requiredWidth = this.messageLbl.Location.X + this.messageLbl.Size.Width + FORM_X_MARGIN;
requiredWidth = requiredWidth > m_minButtonRowWidth ? requiredWidth : m_minButtonRowWidth;
int requiredHeight = this.messageLbl.Location.Y + this.messageLbl.Size.Height - this.btn2.Location.Y + this.ClientSize.Height + TEXT_Y_MARGIN;
int minSetWidth = this.ClientSize.Width > this.m_minWidth ? this.ClientSize.Width : this.m_minWidth;
int minSetHeight = this.ClientSize.Height > this.m_minHeight ? this.ClientSize.Height : this.m_minHeight;
Size s = new Size();
s.Width = requiredWidth > minSetWidth ? requiredWidth : minSetWidth;
s.Height = requiredHeight > minSetHeight ? requiredHeight : minSetHeight;
this.ClientSize = s;
}
/// <summary>
/// Sets the buttons and checkboxe location.
/// </summary>
void setButtonRowLocations()
{
int formWidth = this.ClientRectangle.Width;
int x = formWidth - FORM_X_MARGIN;
int y = btn1.Location.Y;
if (btn3.Visible)
{
x -= btn3.Size.Width;
btn3.Location = new Point(x, y);
x -= BUTTON_SPACE;
}
if (btn2.Visible)
{
x -= btn2.Size.Width;
btn2.Location = new Point(x, y);
x -= BUTTON_SPACE;
}
x -= btn1.Size.Width;
btn1.Location = new Point(x, y);
if (this.chkBx.Visible)
this.chkBx.Location = new Point(FORM_X_MARGIN, this.chkBx.Location.Y);
}
#endregion
#region Icon Pain
/// <summary>
/// The icon to paint.
/// </summary>
Icon m_sysIcon;
/// <summary>
/// Paint the System Icon in the top left corner.
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
if (m_sysIcon != null)
{
Graphics g = e.Graphics;
g.DrawIconUnstretched(m_sysIcon, new Rectangle(FORM_X_MARGIN, FORM_Y_MARGIN, m_sysIcon.Width, m_sysIcon.Height));
}
base.OnPaint(e);
}
#endregion
#region Result API
/// <summary>
/// If visible checkbox was checked.
/// </summary>
public bool CheckboxChecked
{
get
{
return this.chkBx.Checked;
}
}
DialogBoxResult m_result;
/// <summary>
/// Gets the button that was pressed.
/// </summary>
public DialogBoxResult DialogBoxResult
{
get
{
return m_result;
}
}
private void btn_Click(object sender, EventArgs e)
{
if (sender == btn1)
this.m_result = DialogBoxResult.Button1;
else if (sender == btn2)
this.m_result = DialogBoxResult.Button2;
else if (sender == btn3)
this.m_result = DialogBoxResult.Button3;
if (((Button)sender).DialogResult == DialogResult.None)
this.Close();
}
#endregion
}
enum DialogBoxResult
{
Button1,
Button2,
Button3
}
}

View File

@ -0,0 +1,135 @@
namespace BizHawk.Client.EmuHawk
{
partial class MsgBox
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MsgBox));
this.chkBx = new System.Windows.Forms.CheckBox();
this.btn1 = new System.Windows.Forms.Button();
this.btn2 = new System.Windows.Forms.Button();
this.messageLbl = new System.Windows.Forms.Label();
this.btn3 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// chkBx
//
this.chkBx.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.chkBx.AutoSize = true;
this.chkBx.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.chkBx.Location = new System.Drawing.Point(12, 114);
this.chkBx.Name = "chkBx";
this.chkBx.Size = new System.Drawing.Size(152, 20);
this.chkBx.TabIndex = 22;
this.chkBx.Text = "Don\'t show this again";
this.chkBx.UseVisualStyleBackColor = true;
this.chkBx.Visible = false;
//
// btn1
//
this.btn1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btn1.AutoSize = true;
this.btn1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btn1.Location = new System.Drawing.Point(236, 114);
this.btn1.Name = "btn1";
this.btn1.Size = new System.Drawing.Size(75, 23);
this.btn1.TabIndex = 5;
this.btn1.Text = "Button1";
this.btn1.UseVisualStyleBackColor = true;
this.btn1.Visible = false;
this.btn1.Click += new System.EventHandler(this.btn_Click);
//
// btn2
//
this.btn2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btn2.AutoSize = true;
this.btn2.Location = new System.Drawing.Point(317, 114);
this.btn2.Name = "btn2";
this.btn2.Size = new System.Drawing.Size(75, 23);
this.btn2.TabIndex = 6;
this.btn2.Text = "Button2";
this.btn2.UseVisualStyleBackColor = true;
this.btn2.Visible = false;
this.btn2.Click += new System.EventHandler(this.btn_Click);
//
// messageLbl
//
this.messageLbl.AutoSize = true;
this.messageLbl.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.messageLbl.Location = new System.Drawing.Point(58, 10);
this.messageLbl.Name = "messageLbl";
this.messageLbl.Size = new System.Drawing.Size(73, 16);
this.messageLbl.TabIndex = 19;
this.messageLbl.Text = "[Message]";
//
// btn3
//
this.btn3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btn3.AutoSize = true;
this.btn3.Location = new System.Drawing.Point(398, 114);
this.btn3.Name = "btn3";
this.btn3.Size = new System.Drawing.Size(75, 23);
this.btn3.TabIndex = 7;
this.btn3.Text = "Button3";
this.btn3.UseVisualStyleBackColor = true;
this.btn3.Visible = false;
this.btn3.Click += new System.EventHandler(this.btn_Click);
//
// DialogBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btn1;
this.ClientSize = new System.Drawing.Size(485, 149);
this.ControlBox = false;
this.Controls.Add(this.btn3);
this.Controls.Add(this.chkBx);
this.Controls.Add(this.btn1);
this.Controls.Add(this.btn2);
this.Controls.Add(this.messageLbl);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "DialogBox";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "[Title]";
this.Load += new System.EventHandler(this.DialogBox_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.CheckBox chkBx;
private System.Windows.Forms.Button btn1;
private System.Windows.Forms.Button btn2;
private System.Windows.Forms.Label messageLbl;
private System.Windows.Forms.Button btn3;
}
}

View File

@ -0,0 +1,377 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
AABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJ
CSoJCQlhAAAAhgAAAKQAAAC3AAAAvwAAAL8AAAC1AAAAoQAAAIIRERFdHBwcJQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4e
HjcNDQ2TBQUF4gAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gUF
BeAODg6RHh4eNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZ
GQEdHR1UCAgIzAAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/gcHB8gcHBxQHBwcAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAGxsbNggICMoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CAgIxh8fHzIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAB0dHQUSEhKJAQEB/AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEB
AfsRERGDISEhBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAISEhFwoKCsQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/CgoKwB4eHhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFhYjBgYG3gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUFBdkjIyMfAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4eHiECAgLjAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4EBATdCAgIqw0NDYUSEhJsGBgYYBgYGGATExNtDQ0NhQkJ
CawFBQXfAAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBwffHBwcHQAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP///////wAA///AA///AAD//gAAf/8AAP/wAAAP/wAA/+AAAAf/AAD/gAAAAf8AAP8A
AAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAH/gAHwAA8AD//wAfAADwA///wA8AAOAH///gBwAA4Avw//AH
AADAOQAH/AMAAMBwAAH8AwAAgHAAAH4BAACA8AAAPwEAAIHgDwA/gQAAgeAfgB+BAAAD4A+AH8AAAAPg
P4APwAAAB///gA/gAAAH//8AD+AAAAf//gAP4AAAB//4AB/gAAAH/8AAH+AAAA//AAA/8AAAD/4AAP/w
AAAP/AAB//AAAIf4AA//4QAAh/AAP//hAACH8AD//+EAAMfwAf//4wAAx/AB/8fjAADD8AHwB8MAAOP4
AfAHxwAA8fgA+AePAADx/AAAD48AAPj+AAAPHwAA/H8AAA4/AAD+P8AADH8AAP8f+AOY/wAA/4////H/
AAD/x///4/8AAP/z///P/wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAQEBBAAAABwAAAApAAAAKQAAABoBAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAwPAAAMIQAAJABAACYCQAAxiMAAPfvAAA=
</value>
</data>
</root>

View File

@ -1,4 +1,5 @@
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
@ -155,15 +156,22 @@ namespace BizHawk.Client.EmuHawk
else if (Global.Emulator is LibsnesCore)
{
var ss = (LibsnesCore.SnesSyncSettings)Global.Emulator.GetSyncSettings();
if (ss.Profile == "Performance")
if (ss.Profile == "Performance" && !Global.Config.DontAskPerformanceCoreRecordingNag)
{
var result = MessageBox.Show(
this,
"While the performance core is faster, it is recommended that you use the Compatibility profile when recording movies for better accuracy and stability\nSwitch to Compatibility?",
var box = new MsgBox(
"While the performance core is faster, it is recommended that you use the Compatibility profile when recording movies for better accuracy and stability\n\nSwitch to Compatibility?",
"Stability Warning",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Warning);
box.SetButtons(
new [] {"Switch", "Continue", "Cancel" },
new DialogResult[] { DialogResult.Yes, DialogResult.No, DialogResult.Cancel });
box.SetCheckbox("Don't ask me again");
box.MaximumSize = new Size(450, 350);
box.SetMessageToAutoSize();
var result = box.ShowDialog();
Global.Config.DontAskPerformanceCoreRecordingNag = box.CheckboxChecked;
if (result == DialogResult.Yes)
{
ss.Profile = "Compatibility";