BizHawk/BizHawk.Client.EmuHawk/config/PathConfig.cs

453 lines
11 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk
{
public partial class PathConfig : Form
{
// All path text boxes should do some kind of error checking
// Config path under base, config will default to %exe%
private bool _preventSelectedChangeEvent; // Selected Index Changed events are a pain
private void LockDownCores()
{
if (VersionInfo.INTERIM)
{
return;
}
string[] coresToHide = { "PSX", "GBA", "INTV", "C64", "GEN" };
foreach (var core in coresToHide)
{
PathTabControl.TabPages.Remove(
AllTabPages.FirstOrDefault(x => x.Name == core) ?? new TabPage()
2013-11-15 22:27:20 +00:00
);
}
}
private static AutoCompleteStringCollection AutoCompleteOptions
{
get
{
2013-11-15 22:27:20 +00:00
return new AutoCompleteStringCollection
{
"%recent%",
"%exe%",
".\\",
"..\\",
};
}
}
public PathConfig()
{
InitializeComponent();
}
private void LoadSettings()
2013-08-11 14:28:14 +00:00
{
RecentForROMs.Checked = Global.Config.UseRecentForROMs;
BasePathBox.Text = Global.Config.PathEntries.GlobalBaseFragment;
StartTabPages();
2013-08-11 14:28:14 +00:00
SetDefaultFocusedTab();
2013-11-15 22:27:20 +00:00
DoRomToggle();
2013-08-11 14:28:14 +00:00
}
private void SetDefaultFocusedTab()
{
PathTabControl.SelectTab(FindTabByName(Global.Game.System));
2013-08-11 14:28:14 +00:00
}
private TabPage FindTabByName(string name)
{
return PathTabControl.TabPages
.OfType<TabPage>()
.FirstOrDefault(x => x.Name.ToUpper().Contains(name.ToUpper()))
?? new TabPage();
2013-08-11 14:28:14 +00:00
}
private void StartTabPages()
{
PathTabControl.TabPages.Clear();
var systems = Global.Config.PathEntries.Select(x => x.SystemDisplayName).Distinct().ToList();
systems.Sort();
foreach (var systemDisplayName in systems)
{
PathTabControl.TabPages.Add(new TabPage
{
Text = systemDisplayName,
Name = Global.Config.PathEntries.FirstOrDefault(x => x.SystemDisplayName == systemDisplayName).System
});
}
}
private void DoTabPage(TabPage tabPage)
{
const int xpos = 6;
int textboxWidth = tabPage.Width - 150;
const int padding = 5;
const int buttonWidth = 26;
int widgetOffset = textboxWidth + 15;
const int rowHeight = 30;
var paths = Global.Config.PathEntries.Where(x => x.System == tabPage.Name).OrderBy(x => x.Ordinal).ThenBy(x => x.Type).ToList();
int ypos = 14;
foreach (var path in paths)
{
var box = new TextBox
{
Text = path.Path,
Location = new Point(xpos, ypos),
Width = textboxWidth,
Name = path.Type,
Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right,
MinimumSize = new Size(26, 23),
AutoCompleteMode = AutoCompleteMode.SuggestAppend,
AutoCompleteCustomSource = AutoCompleteOptions,
AutoCompleteSource = AutoCompleteSource.CustomSource,
};
var btn = new Button
{
Text = String.Empty,
Image = Properties.Resources.OpenFile,
Location = new Point(widgetOffset, ypos - 1),
Width = buttonWidth,
Name = path.Type,
Anchor = AnchorStyles.Top | AnchorStyles.Right,
};
var tempBox = box;
var tempPath = path.Type;
var tempSystem = path.System;
btn.Click += delegate
{
BrowseFolder(tempBox, tempPath, tempSystem);
};
int infoPadding = 0;
if (tabPage.Name.Contains("Global") && path.Type == "Firmware")
{
infoPadding = 26;
}
var label = new Label
{
Text = path.Type,
Location = new Point(widgetOffset + buttonWidth + padding + infoPadding, ypos + 4),
Width = 100,
Name = path.Type,
Anchor = AnchorStyles.Top | AnchorStyles.Right,
};
tabPage.Controls.Add(label);
tabPage.Controls.Add(btn);
tabPage.Controls.Add(box);
ypos += rowHeight;
}
var sys = tabPage.Name;
if (tabPage.Name == "PCE") // Hack
{
sys = "PCECD";
}
if (tabPage.Name.Contains("Global"))
{
var firmwareButton = new Button
{
Name = sys,
Text = String.Empty,
Image = Properties.Resources.Help,
Location = new Point(499, 253),
Width = 26,
Anchor = AnchorStyles.Top | AnchorStyles.Right
};
firmwareButton.Click += delegate
{
2013-12-19 22:53:06 +00:00
if (Owner is FirmwaresConfig)
{
MessageBox.Show("C-C-C-Combo Breaker!", "Nice try, but");
return;
}
var f = new FirmwaresConfig { TargetSystem = sys };
2013-12-19 22:53:06 +00:00
f.ShowDialog(this);
};
tabPage.Controls.Add(firmwareButton);
}
}
// TODO: this is only used by the defaults button, refactor since it is now redundant code (will have to force the rebuilding of all tabpages, currently they only build as necessar
2013-11-15 22:27:20 +00:00
private void DoTabs(List<PathEntry> pathCollection)
{
_preventSelectedChangeEvent = true;
PathTabControl.Visible = false;
2013-08-11 20:06:27 +00:00
PathTabControl.TabPages.Clear();
// Separate by system
var systems = Global.Config.PathEntries.Select(x => x.SystemDisplayName).Distinct().ToList();
systems.Sort();
// Hacky way to put global first
var global = systems.FirstOrDefault(x => x == "Global");
systems.Remove(global);
systems.Insert(0, global);
var tabPages = new List<TabPage>(systems.Count);
2013-11-15 22:27:20 +00:00
const int _x = 6;
const int textboxWidth = 70;
const int padding = 5;
const int buttonWidth = 26;
const int widgetOffset = 85;
const int rowHeight = 30;
foreach (var systemDisplayName in systems)
{
var systemId = Global.Config.PathEntries.FirstOrDefault(x => x.SystemDisplayName == systemDisplayName).System;
var t = new TabPage
{
Text = systemDisplayName,
Name = systemId,
};
var paths = pathCollection.Where(x => x.System == systemId).OrderBy(x => x.Ordinal).ThenBy(x => x.Type).ToList();
var _y = 14;
2013-08-11 14:28:14 +00:00
foreach (var path in paths)
{
var box = new TextBox
{
Text = path.Path,
Location = new Point(_x, _y),
2013-11-15 22:27:20 +00:00
Width = textboxWidth,
2013-08-11 16:20:35 +00:00
Name = path.Type,
Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right,
MinimumSize = new Size(26, 23),
AutoCompleteMode = AutoCompleteMode.SuggestAppend,
AutoCompleteCustomSource = AutoCompleteOptions,
AutoCompleteSource = AutoCompleteSource.CustomSource,
};
var btn = new Button
{
Text = String.Empty,
2013-11-15 22:27:20 +00:00
Image = Properties.Resources.OpenFile,
Location = new Point(widgetOffset, _y - 1),
Width = buttonWidth,
Name = path.Type,
2013-08-11 16:20:35 +00:00
Anchor = AnchorStyles.Top | AnchorStyles.Right,
};
var tempBox = box;
var tempPath = path.Type;
var tempSystem = path.System;
2013-11-15 22:27:20 +00:00
btn.Click += delegate
2013-08-11 14:28:14 +00:00
{
BrowseFolder(tempBox, tempPath, tempSystem);
2013-11-15 22:27:20 +00:00
};
var label = new Label
2013-11-15 22:27:20 +00:00
{
Text = path.Type,
2013-11-15 22:27:20 +00:00
Location = new Point(widgetOffset + buttonWidth + padding, _y + 4),
2013-08-11 16:20:35 +00:00
Width = 100,
Name = path.Type,
Anchor = AnchorStyles.Top | AnchorStyles.Right,
};
t.Controls.Add(label);
2013-08-11 16:20:35 +00:00
t.Controls.Add(btn);
t.Controls.Add(box);
2013-11-15 22:27:20 +00:00
_y += rowHeight;
}
var sys = systemDisplayName;
if (systemDisplayName == "PCE") // Hack
{
sys = "PCECD";
}
var hasFirmwares = FirmwaresConfig.SystemGroupNames.Any(x => x.Key == sys);
if (hasFirmwares)
{
var firmwareButton = new Button
{
Name = sys,
Text = "&Firmware",
Location = new Point(_x, _y),
Width = 75,
};
2013-11-15 22:27:20 +00:00
firmwareButton.Click += delegate
{
var f = new FirmwaresConfig { TargetSystem = sys };
f.ShowDialog();
2013-11-15 22:27:20 +00:00
};
t.Controls.Add(firmwareButton);
}
2013-11-15 22:27:20 +00:00
tabPages.Add(t);
}
2013-11-15 22:27:20 +00:00
PathTabControl.TabPages.AddRange(tabPages.ToArray());
PathTabControl.Visible = true;
_preventSelectedChangeEvent = false;
}
private static void BrowseFolder(TextBox box, string name, string system)
{
// Ugly hack, we don't want to pass in the system in for system base and global paths
if (name == "Base" || system == "Global" || system == "Global_NULL")
{
2013-11-15 22:27:20 +00:00
system = null;
}
var f = new FolderBrowserDialog
{
2013-11-15 22:27:20 +00:00
Description = "Set the directory for " + name,
SelectedPath = PathManager.MakeAbsolutePath(box.Text, system)
};
var result = f.ShowDialog();
if (result == DialogResult.OK)
{
2013-11-15 22:27:20 +00:00
box.Text = PathManager.TryMakeRelative(f.SelectedPath, system);
}
}
private void SaveSettings()
{
2013-08-11 14:28:14 +00:00
Global.Config.UseRecentForROMs = RecentForROMs.Checked;
Global.Config.PathEntries["Global", "Base"].Path = BasePathBox.Text;
foreach (var t in AllPathBoxes)
{
var pathEntry = Global.Config.PathEntries.FirstOrDefault(x => x.System == t.Parent.Name && x.Type == t.Name);
pathEntry.Path = t.Text;
2013-08-11 14:28:14 +00:00
}
}
2013-11-15 22:27:20 +00:00
private void DoRomToggle()
{
var pcontrols = AllPathControls.Where(x => x.Name == "ROM").ToList();
foreach (var c in pcontrols)
{
c.Enabled = !RecentForROMs.Checked;
}
}
2013-11-15 22:27:20 +00:00
private IEnumerable<TextBox> AllPathBoxes
{
get
{
var allPathBoxes = new List<TextBox>();
foreach (TabPage tp in PathTabControl.TabPages)
{
allPathBoxes.AddRange(tp.Controls.OfType<TextBox>());
}
return allPathBoxes;
}
}
2013-11-15 22:27:20 +00:00
private IEnumerable<Control> AllPathControls
{
get
{
var allPathControls = new List<Control>();
foreach (TabPage tp in PathTabControl.TabPages)
{
allPathControls.AddRange(tp.Controls.OfType<Control>());
}
return allPathControls;
}
}
2013-08-11 20:06:27 +00:00
2013-11-15 22:27:20 +00:00
private IEnumerable<TabPage> AllTabPages
{
get { return PathTabControl.TabPages.Cast<TabPage>(); }
}
#region Events
private void NewPathConfig_Load(object sender, EventArgs e)
2013-08-11 20:06:27 +00:00
{
LoadSettings();
LockDownCores();
}
private void RecentForROMs_CheckedChanged(object sender, EventArgs e)
{
DoRomToggle();
2013-08-11 20:06:27 +00:00
}
private void PathTabControl_SelectedIndexChanged(object sender, EventArgs e)
{
if (!_preventSelectedChangeEvent && PathTabControl.TabPages.Count > 0)
{
var tabPage = (sender as TabControl).SelectedTab;
if (tabPage.Controls.Count == 0)
{
DoTabPage((sender as TabControl).SelectedTab);
}
}
}
private void BrowseBase_Click(object sender, EventArgs e)
{
var f = new FolderBrowserDialog
{
Description = "Set the directory for the base global path",
SelectedPath = PathManager.MakeAbsolutePath(BasePathBox.Text, null)
};
var result = f.ShowDialog();
if (result == DialogResult.OK)
{
BasePathBox.Text = f.SelectedPath;
}
}
private void SpecialCommandsBtn_Click(object sender, EventArgs e)
{
new PathInfo().Show();
}
private void SaveBtn_Click(object sender, EventArgs e)
{
SaveSettings();
}
private void DefaultsBtn_Click(object sender, EventArgs e)
{
DoTabs(PathEntryCollection.DefaultValues);
}
private void Ok_Click(object sender, EventArgs e)
{
SaveSettings();
GlobalWin.OSD.AddMessage("Path settings saved");
Close();
}
private void Cancel_Click(object sender, EventArgs e)
{
GlobalWin.OSD.AddMessage("Path config aborted");
Close();
}
#endregion
}
}