new controller config: split into tabs by player number. this is done by examining the names in the controller definition for "P#" strings, so if it doesn't work for a particular definition, that's why...
This commit is contained in:
parent
5cf95ae5f1
commit
a4ea33aa6e
|
@ -11,18 +11,22 @@ namespace BizHawk.MultiClient
|
||||||
|
|
||||||
public partial class ControllerConfigPanel : UserControl
|
public partial class ControllerConfigPanel : UserControl
|
||||||
{
|
{
|
||||||
|
// the dictionary that results are saved to
|
||||||
Dictionary<string, string> RealConfigObject;
|
Dictionary<string, string> RealConfigObject;
|
||||||
|
// if nonnull, the list of keys to use. used to have the config panel operate on a smaller list than the whole dictionary;
|
||||||
|
// for instance, to show only a single player
|
||||||
|
List<string> RealConfigButtons;
|
||||||
|
|
||||||
public List<string> buttons = new List<string>();
|
public List<string> buttons = new List<string>();
|
||||||
|
|
||||||
public int InputMarginLeft = 0;
|
public int InputMarginLeft = 0;
|
||||||
public int LabelPadding = 10;
|
public int LabelPadding = 5;
|
||||||
|
|
||||||
public int MarginTop = 0;
|
public int MarginTop = 0;
|
||||||
public int Spacing = 30;
|
public int Spacing = 24;
|
||||||
public int InputSize = 200;
|
public int InputSize = 100;
|
||||||
public int ColumnWidth = 220;
|
public int ColumnWidth = 170;
|
||||||
public int LabelWidth = 100;
|
public int LabelWidth = 60;
|
||||||
|
|
||||||
protected List<InputWidget> Inputs = new List<InputWidget>();
|
protected List<InputWidget> Inputs = new List<InputWidget>();
|
||||||
protected List<Label> Labels = new List<Label>();
|
protected List<Label> Labels = new List<Label>();
|
||||||
|
@ -82,9 +86,10 @@ namespace BizHawk.MultiClient
|
||||||
RealConfigObject[buttons[button]] = Inputs[button].Text;
|
RealConfigObject[buttons[button]] = Inputs[button].Text;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadSettings(Dictionary<string, string> configobj)
|
public void LoadSettings(Dictionary<string, string> configobj, List<string> configbuttons = null)
|
||||||
{
|
{
|
||||||
RealConfigObject = configobj;
|
RealConfigObject = configobj;
|
||||||
|
RealConfigButtons = configbuttons;
|
||||||
SetButtonList();
|
SetButtonList();
|
||||||
Startup();
|
Startup();
|
||||||
SetWidgetStrings();
|
SetWidgetStrings();
|
||||||
|
@ -93,7 +98,8 @@ namespace BizHawk.MultiClient
|
||||||
protected void SetButtonList()
|
protected void SetButtonList()
|
||||||
{
|
{
|
||||||
buttons.Clear();
|
buttons.Clear();
|
||||||
foreach (string s in RealConfigObject.Keys)
|
IEnumerable<string> bl = RealConfigButtons ?? (IEnumerable<string>)RealConfigObject.Keys;
|
||||||
|
foreach (string s in bl)
|
||||||
buttons.Add(s);
|
buttons.Add(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,14 +32,90 @@ namespace BizHawk.MultiClient.config
|
||||||
//ControllerImages.Add(, Properties.Resources);
|
//ControllerImages.Add(, Properties.Resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int MAXPLAYERS = 8;
|
||||||
|
|
||||||
private NewControllerConfig()
|
private NewControllerConfig()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
ControllerConfigPanel normcontrls;
|
static void LoadToPanel(Control dest, ControllerDefinition def, Dictionary<string, Dictionary<string, string>> settingsblock)
|
||||||
ControllerConfigPanel autofirecontrls;
|
{
|
||||||
|
Dictionary<string, string> settings;
|
||||||
|
if (!settingsblock.TryGetValue(def.Name, out settings))
|
||||||
|
{
|
||||||
|
settings = new Dictionary<string, string>();
|
||||||
|
settingsblock[def.Name] = settings;
|
||||||
|
}
|
||||||
|
// check to make sure that the settings object has all of the appropriate boolbuttons
|
||||||
|
foreach (string button in def.BoolButtons)
|
||||||
|
{
|
||||||
|
if (!settings.Keys.Contains(button))
|
||||||
|
settings[button] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.Keys.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// split the list of all settings into buckets by player number
|
||||||
|
List<string>[] buckets = new List<string>[MAXPLAYERS + 1];
|
||||||
|
for (int i = 0; i < buckets.Length; i++)
|
||||||
|
buckets[i] = new List<string>();
|
||||||
|
|
||||||
|
foreach (string button in settings.Keys)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 1; i <= MAXPLAYERS; i++)
|
||||||
|
{
|
||||||
|
if (button.StartsWith("P" + i))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i > MAXPLAYERS) // couldn't find
|
||||||
|
i = 0;
|
||||||
|
buckets[i].Add(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buckets[0].Count == settings.Keys.Count)
|
||||||
|
{
|
||||||
|
// everything went into bucket 0, so make no tabs at all
|
||||||
|
var cp = new ControllerConfigPanel();
|
||||||
|
cp.Dock = DockStyle.Fill;
|
||||||
|
dest.Controls.Add(cp);
|
||||||
|
cp.LoadSettings(settings);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// create multiple player tabs
|
||||||
|
var tt = new TabControl();
|
||||||
|
tt.Dock = DockStyle.Fill;
|
||||||
|
dest.Controls.Add(tt);
|
||||||
|
int pageidx = 0;
|
||||||
|
for (int i = 1; i <= MAXPLAYERS; i++)
|
||||||
|
{
|
||||||
|
if (buckets[i].Count > 0)
|
||||||
|
{
|
||||||
|
tt.TabPages.Add("Player " + i);
|
||||||
|
|
||||||
|
var cp = new ControllerConfigPanel();
|
||||||
|
cp.Dock = DockStyle.Fill;
|
||||||
|
tt.TabPages[pageidx].Controls.Add(cp);
|
||||||
|
cp.LoadSettings(settings, buckets[i]);
|
||||||
|
pageidx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (buckets[0].Count > 0)
|
||||||
|
{
|
||||||
|
tt.TabPages.Add("Console");
|
||||||
|
var cp = new ControllerConfigPanel();
|
||||||
|
cp.Dock = DockStyle.Fill;
|
||||||
|
tt.TabPages[pageidx].Controls.Add(cp);
|
||||||
|
cp.LoadSettings(settings, buckets[0]);
|
||||||
|
pageidx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
static void DoLoadSettings(ControllerConfigPanel cp, ControllerDefinition def, Dictionary<string, Dictionary<string, string>> settingsblock)
|
static void DoLoadSettings(ControllerConfigPanel cp, ControllerDefinition def, Dictionary<string, Dictionary<string, string>> settingsblock)
|
||||||
{
|
{
|
||||||
cp.Spacing = 24;
|
cp.Spacing = 24;
|
||||||
|
@ -62,20 +138,25 @@ namespace BizHawk.MultiClient.config
|
||||||
}
|
}
|
||||||
cp.LoadSettings(settings);
|
cp.LoadSettings(settings);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
public NewControllerConfig(ControllerDefinition def)
|
public NewControllerConfig(ControllerDefinition def)
|
||||||
: this()
|
: this()
|
||||||
{
|
{
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
normcontrls = new ControllerConfigPanel();
|
/*
|
||||||
|
var normcontrls = new ControllerConfigPanel();
|
||||||
normcontrls.Dock = DockStyle.Fill;
|
normcontrls.Dock = DockStyle.Fill;
|
||||||
tabPage1.Controls.Add(normcontrls);
|
tabPage1.Controls.Add(normcontrls);
|
||||||
DoLoadSettings(normcontrls, def, Global.Config.AllTrollers);
|
DoLoadSettings(normcontrls, def, Global.Config.AllTrollers);
|
||||||
|
|
||||||
autofirecontrls = new ControllerConfigPanel();
|
var autofirecontrls = new ControllerConfigPanel();
|
||||||
autofirecontrls.Dock = DockStyle.Fill;
|
autofirecontrls.Dock = DockStyle.Fill;
|
||||||
tabPage2.Controls.Add(autofirecontrls);
|
tabPage2.Controls.Add(autofirecontrls);
|
||||||
DoLoadSettings(autofirecontrls, def, Global.Config.AllTrollersAutoFire);
|
DoLoadSettings(autofirecontrls, def, Global.Config.AllTrollersAutoFire);
|
||||||
|
*/
|
||||||
|
LoadToPanel(tabPage1, def, Global.Config.AllTrollers);
|
||||||
|
LoadToPanel(tabPage2, def, Global.Config.AllTrollersAutoFire);
|
||||||
|
|
||||||
label1.Text = "Currently Configuring: " + def.Name;
|
label1.Text = "Currently Configuring: " + def.Name;
|
||||||
checkBoxUDLR.Checked = Global.Config.AllowUD_LR;
|
checkBoxUDLR.Checked = Global.Config.AllowUD_LR;
|
||||||
|
@ -96,10 +177,31 @@ namespace BizHawk.MultiClient.config
|
||||||
tableLayoutPanel1.ColumnStyles[1].Width = bmp.Width;
|
tableLayoutPanel1.ColumnStyles[1].Width = bmp.Width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// lazy methods, but they're not called often and actually
|
||||||
|
// tracking all of the ControllerConfigPanels wouldn't be simpler
|
||||||
|
static void SetAutoTab(Control c, bool value)
|
||||||
|
{
|
||||||
|
if (c is ControllerConfigPanel)
|
||||||
|
(c as ControllerConfigPanel).SetAutoTab(value);
|
||||||
|
else if (c.HasChildren)
|
||||||
|
foreach (Control cc in c.Controls)
|
||||||
|
SetAutoTab(cc, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Save(Control c)
|
||||||
|
{
|
||||||
|
if (c is ControllerConfigPanel)
|
||||||
|
(c as ControllerConfigPanel).Save();
|
||||||
|
else if (c.HasChildren)
|
||||||
|
foreach (Control cc in c.Controls)
|
||||||
|
Save(cc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void checkBoxAutoTab_CheckedChanged(object sender, EventArgs e)
|
private void checkBoxAutoTab_CheckedChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
normcontrls.SetAutoTab(checkBoxAutoTab.Checked);
|
SetAutoTab(this, checkBoxAutoTab.Checked);
|
||||||
autofirecontrls.SetAutoTab(checkBoxAutoTab.Checked);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkBoxUDLR_CheckedChanged(object sender, EventArgs e)
|
private void checkBoxUDLR_CheckedChanged(object sender, EventArgs e)
|
||||||
|
@ -111,8 +213,7 @@ namespace BizHawk.MultiClient.config
|
||||||
Global.Config.AllowUD_LR = checkBoxUDLR.Checked;
|
Global.Config.AllowUD_LR = checkBoxUDLR.Checked;
|
||||||
Global.Config.InputConfigAutoTab = checkBoxAutoTab.Checked;
|
Global.Config.InputConfigAutoTab = checkBoxAutoTab.Checked;
|
||||||
|
|
||||||
normcontrls.Save();
|
Save(this);
|
||||||
autofirecontrls.Save();
|
|
||||||
|
|
||||||
Global.OSD.AddMessage("Controller settings saved");
|
Global.OSD.AddMessage("Controller settings saved");
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
|
|
Loading…
Reference in New Issue