Input Config - show when a button mapping conflicts with a hotkey mapping (but still allow it)

This commit is contained in:
andres.delikat 2012-09-10 17:49:33 +00:00
parent 259be1c607
commit 1460f7b860
3 changed files with 104 additions and 20 deletions

View File

@ -88,8 +88,26 @@ namespace BizHawk.MultiClient
foreach (string control in controlbindings) foreach (string control in controlbindings)
bindings[button].Add(control.Trim()); bindings[button].Add(control.Trim());
} }
}
/// <summary>
/// Returns a list of all keys mapped and the name of the button they are mapped to
/// </summary>
/// <returns></returns>
public List<KeyValuePair<string, string>> MappingList()
{
List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
foreach (KeyValuePair<string, List<string>> key in bindings)
{
foreach (string binding in key.Value)
{
list.Add(new KeyValuePair<string, string>(binding, key.Key));
}
}
return list;
}
}
public class AutofireController : IController public class AutofireController : IController
{ {

View File

@ -52,6 +52,9 @@ namespace BizHawk.MultiClient
{"SNES", 4}, {"SNES", 4},
{"TI-83", 1} {"TI-83", 1}
}; };
private List<KeyValuePair<string, string>> HotkeyMappingList = new List<KeyValuePair<string, string>>(); //A list of all button mappings and the hotkey they are assigned to
private ArrayList Labels; private ArrayList Labels;
private ArrayList TextBoxes; private ArrayList TextBoxes;
private string CurSelectConsole; private string CurSelectConsole;
@ -199,7 +202,7 @@ namespace BizHawk.MultiClient
int yoffset = (row * 24); int yoffset = (row * 24);
TempLabel.Location = new Point(8 + xoffset, 20 + yoffset); TempLabel.Location = new Point(8 + xoffset, 20 + yoffset);
Labels.Add(TempLabel); Labels.Add(TempLabel);
TempTextBox = new InputWidget(); TempTextBox = new InputWidget(HotkeyMappingList);
TempTextBox.Location = new Point(64 + xoffset, 20 + yoffset); TempTextBox.Location = new Point(64 + xoffset, 20 + yoffset);
TextBoxes.Add(TempTextBox); TextBoxes.Add(TempTextBox);
object field = null; object field = null;
@ -459,7 +462,11 @@ namespace BizHawk.MultiClient
private void InputConfig_Load(object sender, EventArgs e) private void InputConfig_Load(object sender, EventArgs e)
{ {
if (Global.MainForm.INTERIM) if (Global.MainForm.INTERIM)
{
SystemComboBox.Items.Add("Atari"); //When Atari is ready, add this in the designer instead SystemComboBox.Items.Add("Atari"); //When Atari is ready, add this in the designer instead
}
HotkeyMappingList = Global.ClientControls.MappingList();
AutoTab.Checked = Global.Config.InputConfigAutoTab; AutoTab.Checked = Global.Config.InputConfigAutoTab;
SetAutoTab(); SetAutoTab();

View File

@ -3,6 +3,7 @@ using System.Drawing;
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows.Forms; using System.Windows.Forms;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text;
namespace BizHawk.MultiClient namespace BizHawk.MultiClient
{ {
@ -18,8 +19,20 @@ namespace BizHawk.MultiClient
string wasPressed = ""; string wasPressed = "";
ToolTip tooltip1 = new ToolTip(); ToolTip tooltip1 = new ToolTip();
public string ButtonName; public string ButtonName;
Color HighlightedColor = Color.LightCyan; Color _highlight_color = Color.LightCyan;
Color RegularColor = SystemColors.Window; Color _no_highlight_color = SystemColors.Window;
private void Highlight()
{
BackColor = _highlight_color;
}
private void UnHighlight()
{
BackColor = _no_highlight_color;
}
private List<KeyValuePair<string, string>> ConflictLookup = new List<KeyValuePair<string, string>>();
[DllImport("user32")] [DllImport("user32")]
private static extern bool HideCaret(IntPtr hWnd); private static extern bool HideCaret(IntPtr hWnd);
@ -32,6 +45,15 @@ namespace BizHawk.MultiClient
tooltip1.AutoPopDelay = 2000; tooltip1.AutoPopDelay = 2000;
} }
public InputWidget(List<KeyValuePair<string, string>> conflictList)
{
this.ContextMenu = new ContextMenu();
this.timer.Tick += new System.EventHandler(this.Timer_Tick);
InitializeBindings();
tooltip1.AutoPopDelay = 2000;
ConflictLookup = conflictList;
}
public InputWidget(int maxBindings) public InputWidget(int maxBindings)
{ {
this.ContextMenu = new ContextMenu(); this.ContextMenu = new ContextMenu();
@ -42,19 +64,9 @@ namespace BizHawk.MultiClient
tooltip1.AutoPopDelay = 2000; tooltip1.AutoPopDelay = 2000;
} }
public void FlagDuplicate(string duplicateName) public void SetConflictList(List<KeyValuePair<string, string>> conflictLookup)
{ {
RegularColor = Color.LightCoral; ConflictLookup = conflictLookup;
HighlightedColor = Color.Violet;
BackColor = RegularColor;
tooltip1.SetToolTip(this, "same mapping as " + duplicateName);
}
public void UnflagDuplicate()
{
HighlightedColor = Color.LightCyan;
RegularColor = SystemColors.Window;
tooltip1.SetToolTip(this, "");
} }
protected override void OnMouseClick(MouseEventArgs e) protected override void OnMouseClick(MouseEventArgs e)
@ -115,12 +127,60 @@ namespace BizHawk.MultiClient
Bindings[pos] = TempBindingStr; Bindings[pos] = TempBindingStr;
} }
wasPressed = TempBindingStr; wasPressed = TempBindingStr;
DoConflictCheck();
UpdateLabel(); UpdateLabel();
Increment(); Increment();
} }
} }
public bool IsDuplicate(string binding) private string Conflicts = "";
private void DoConflictCheck()
{
StringBuilder conflicts = new StringBuilder(); ;
foreach (KeyValuePair<string, string> conflict in ConflictLookup)
{
foreach (string binding in Bindings)
{
if (conflict.Key == binding)
{
conflicts.Append(binding);
conflicts.Append(" conflicts with Hotkey - "); //Ideally we don't hardcode Hotkey, we may want to check mappings on specific controllers or unforeseen things
conflicts.Append(conflict.Value);
conflicts.Append('\n');
}
}
}
Conflicts = conflicts.ToString();
if (String.IsNullOrWhiteSpace(Conflicts))
{
HideConflicts();
}
else
{
ShowConflicts();
}
}
private void ShowConflicts()
{
_no_highlight_color = Color.LightCoral;
_highlight_color = Color.Violet;
tooltip1.SetToolTip(this, Conflicts);
}
private void HideConflicts()
{
_highlight_color = Color.LightCyan;
_no_highlight_color = SystemColors.Window;
tooltip1.SetToolTip(this, "");
}
//Checks if the key is already mapped to this widget
private bool IsDuplicate(string binding)
{ {
for (int x = 0; x < MaxBind; x++) for (int x = 0; x < MaxBind; x++)
{ {
@ -274,13 +334,12 @@ namespace BizHawk.MultiClient
{ {
//base.OnGotFocus(e); //base.OnGotFocus(e);
HideCaret(this.Handle); HideCaret(this.Handle);
BackColor = HighlightedColor; Highlight();
} }
protected override void OnLostFocus(EventArgs e) protected override void OnLostFocus(EventArgs e)
{ {
UnflagDuplicate(); UnHighlight();
BackColor = RegularColor;
base.OnLostFocus(e); base.OnLostFocus(e);
} }