BizHawk/BizHawk.Client.EmuHawk/config/GenericCoreConfig.cs

158 lines
3.8 KiB
C#

using System;
using System.Windows.Forms;
using System.Reflection;
using System.ComponentModel;
using BizHawk.Client.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.EmuHawk
{
public partial class GenericCoreConfig : Form
{
private object _s;
private object _ss;
private bool _syncsettingschanged;
bool settingschanged = false;
private GenericCoreConfig(bool ignoresettings, bool ignoresyncsettings)
{
InitializeComponent();
var settable = new SettingsAdapter(Global.Emulator);
if (settable.HasSettings && !ignoresettings)
{
_s = settable.GetSettings();
}
if (settable.HasSyncSettings && !ignoresyncsettings)
{
_ss = settable.GetSyncSettings();
}
if (_s != null)
{
propertyGrid1.SelectedObject = _s;
ChangeDescriptionHeight(propertyGrid1);
}
else
{
tabControl1.TabPages.Remove(tabPage1);
}
if (_ss != null)
{
propertyGrid2.SelectedObject = _ss;
ChangeDescriptionHeight(propertyGrid2);
}
else
{
tabControl1.TabPages.Remove(tabPage2);
}
if (Global.MovieSession.Movie.IsActive)
{
propertyGrid2.Enabled = false; // disable changes to sync setting when movie, so as not to confuse user
}
}
private GenericCoreConfig()
: this(false, false)
{
}
private static void ChangeDescriptionHeight(PropertyGrid grid)
{
if (grid == null)
throw new ArgumentNullException("grid");
int maxlen = 0;
string desc = "";
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(grid.SelectedObject))
{
if (property.Description.Length > maxlen)
{
maxlen = property.Description.Length;
desc = property.Description;
}
}
foreach (Control control in grid.Controls)
{
if (control.GetType().Name == "DocComment")
{
FieldInfo field = control.GetType().GetField("userSized", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(control, true);
int height = (int)System.Drawing.Graphics.FromHwnd(control.Handle).MeasureString(desc, control.Font, grid.Width).Height;
control.Height = Math.Max(20, height) + 16; // magic for now
return;
}
}
}
private void OkBtn_Click(object sender, EventArgs e)
{
if (_s != null && settingschanged)
{
GlobalWin.MainForm.PutCoreSettings(_s);
}
if (_ss != null && _syncsettingschanged)
{
GlobalWin.MainForm.PutCoreSyncSettings(_ss);
}
DialogResult = DialogResult.OK;
Close();
}
public static void DoDialog(IWin32Window owner, string title)
{
using (var dlg = new GenericCoreConfig { Text = title })
{
dlg.ShowDialog(owner);
}
}
public static void DoDialog(IWin32Window owner, string title, bool hidesettings, bool hidesyncsettings)
{
using (var dlg = new GenericCoreConfig(hidesettings, hidesyncsettings) { Text = title })
{
dlg.ShowDialog(owner);
}
}
private void PropertyGrid2_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
_syncsettingschanged = true;
}
private void GenericCoreConfig_Load(object sender, EventArgs e)
{
}
private void DefaultsBtn_Click(object sender, EventArgs e)
{
// the new config objects guarantee that the default constructor gives a default-settings object
if (_s != null)
{
_s = Activator.CreateInstance(_s.GetType());
propertyGrid1.SelectedObject = _s;
}
if (_ss != null)
{
_ss = Activator.CreateInstance(_ss.GetType());
propertyGrid2.SelectedObject = _ss;
_syncsettingschanged = true;
}
}
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
settingschanged = true;
}
}
}