From 2774e9c252d36e765dde8a62566581fdcc0548d3 Mon Sep 17 00:00:00 2001 From: adelikat Date: Sat, 14 Jun 2014 02:23:13 +0000 Subject: [PATCH] Add a "Don't ask me again" checkbox on the Performance core recording nag --- BizHawk.Client.Common/config/Config.cs | 1 + .../BizHawk.Client.EmuHawk.csproj | 9 + .../CustomControls/MsgBox.cs | 351 ++++++++++++++++ .../CustomControls/MsgBox.designer.cs | 135 +++++++ .../CustomControls/MsgBox.resx | 377 ++++++++++++++++++ BizHawk.Client.EmuHawk/MainForm.Movie.cs | 18 +- 6 files changed, 886 insertions(+), 5 deletions(-) create mode 100644 BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs create mode 100644 BizHawk.Client.EmuHawk/CustomControls/MsgBox.designer.cs create mode 100644 BizHawk.Client.EmuHawk/CustomControls/MsgBox.resx diff --git a/BizHawk.Client.Common/config/Config.cs b/BizHawk.Client.Common/config/Config.cs index a5cc4ef186..b9fe946ca7 100644 --- a/BizHawk.Client.Common/config/Config.cs +++ b/BizHawk.Client.Common/config/Config.cs @@ -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; diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj index 34b5cd331c..04150f5918 100644 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj @@ -433,6 +433,12 @@ Component + + Form + + + MsgBox.cs + Form @@ -1131,6 +1137,9 @@ InputConfigBase.cs + + MsgBox.cs + QuickProgressPopup.cs diff --git a/BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs new file mode 100644 index 0000000000..ced8e7b5c9 --- /dev/null +++ b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.cs @@ -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 +{ + /// + /// A customizable Dialog box with 3 buttons, custom icon, and checkbox. + /// + partial class MsgBox : Form + { + /// + /// Create a new instance of the dialog box with a message and title. + /// + /// Message text. + /// Dialog Box title. + public MsgBox(string message, string title) + : this(message, title, MessageBoxIcon.None) + { + + } + + /// + /// Create a new instance of the dialog box with a message and title and a standard windows messagebox icon. + /// + /// Message text. + /// Dialog Box title. + /// Standard system messagebox icon. + public MsgBox(string message, string title, MessageBoxIcon icon) + : this(message, title, getMessageBoxIcon(icon)) + { + + } + + /// + /// Create a new instance of the dialog box with a message and title and a custom windows icon. + /// + /// Message text. + /// Dialog Box title. + /// Custom icon. + 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); + } + + /// + /// Get system icon for MessageBoxIcon. + /// + /// The MessageBoxIcon value. + /// SystemIcon type Icon. + 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 + + /// + /// Min set width. + /// + int m_minWidth; + /// + /// Min set height. + /// + int m_minHeight; + + /// + /// 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. + /// + /// Min width value. + /// Min height value. + public void SetMinSize(int width, int height) + { + m_minWidth = width; + m_minHeight = height; + } + + /// + /// Create up to 3 buttons with no DialogResult values. + /// + /// Array of button names. Must of length 1-3. + 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); + } + + /// + /// Create up to 3 buttons with given DialogResult values. + /// + /// Array of button names. Must of length 1-3. + /// Array of DialogResult values. Must be same length as names. + public void SetButtons(string[] names, DialogResult[] results) + { + this.SetButtons(names, results, 1); + } + + /// + /// Create up to 3 buttons with given DialogResult values. + /// + /// Array of button names. Must of length 1-3. + /// Array of DialogResult values. Must be same length as names. + /// Default Button number. Must be 1-3. + 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; + } + + } + + /// + /// The min required width of the button and checkbox row. Sum of button widths + checkbox width + margins. + /// + int m_minButtonRowWidth; + + /// + /// Sets button text and returns the width. + /// + /// Button object. + /// Text of the button. + /// TabIndex of the button. + /// DialogResult of the button. + /// Width of the button. + 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; + } + + /// + /// Enables the checkbox. By default the checkbox is unchecked. + /// + /// Text of the checkbox. + public void SetCheckbox(string text) + { + this.SetCheckbox(text, false); + } + + /// + /// Enables the checkbox and the default checked state. + /// + /// Text of the checkbox. + /// Default checked state of the box. + 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; + + /// + /// Auto fits the dialog box to fit the text and the buttons. + /// + 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; + } + + /// + /// Sets the buttons and checkboxe location. + /// + 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 + /// + /// The icon to paint. + /// + Icon m_sysIcon; + + /// + /// Paint the System Icon in the top left corner. + /// + /// + 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 + + /// + /// If visible checkbox was checked. + /// + public bool CheckboxChecked + { + get + { + return this.chkBx.Checked; + } + } + + DialogBoxResult m_result; + /// + /// Gets the button that was pressed. + /// + 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 + } +} diff --git a/BizHawk.Client.EmuHawk/CustomControls/MsgBox.designer.cs b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.designer.cs new file mode 100644 index 0000000000..3a4919a996 --- /dev/null +++ b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.designer.cs @@ -0,0 +1,135 @@ +namespace BizHawk.Client.EmuHawk +{ + partial class MsgBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + 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; + } +} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/MsgBox.resx b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.resx new file mode 100644 index 0000000000..4369d0a05f --- /dev/null +++ b/BizHawk.Client.EmuHawk/CustomControls/MsgBox.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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= + + + \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/MainForm.Movie.cs b/BizHawk.Client.EmuHawk/MainForm.Movie.cs index 90a3a38b4d..9fd9845428 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Movie.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Movie.cs @@ -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";