106 lines
2.8 KiB
C#
106 lines
2.8 KiB
C#
using System;
|
|
using System.Windows.Forms;
|
|
|
|
namespace BizHawk.Client.EmuHawk
|
|
{
|
|
public partial class InputCompositeWidget : UserControl
|
|
{
|
|
public InputCompositeWidget()
|
|
{
|
|
InitializeComponent();
|
|
|
|
_dropdownMenu = new ContextMenuStrip();
|
|
|
|
_dropdownMenu.ItemClicked += DropdownMenu_ItemClicked;
|
|
_dropdownMenu.PreviewKeyDown += DropdownMenu_PreviewKeyDown;
|
|
foreach (var spec in InputWidget.SpecialBindings)
|
|
{
|
|
var tsi = new ToolStripMenuItem(spec.BindingName) { ToolTipText = spec.TooltipText };
|
|
_dropdownMenu.Items.Add(tsi);
|
|
}
|
|
|
|
btnSpecial.ContextMenuStrip = _dropdownMenu;
|
|
|
|
widget.CompositeWidget = this;
|
|
}
|
|
|
|
private static readonly string WidgetTooltipText = "* Escape clears a key mapping\r\n* Disable Auto Tab to multiply bind";
|
|
private ToolTip _tooltip;
|
|
private string _bindingTooltipText;
|
|
|
|
public void SetupTooltip(ToolTip tip, string bindingText)
|
|
{
|
|
_tooltip = tip;
|
|
_tooltip.SetToolTip(btnSpecial, "Click here for special tricky bindings");
|
|
_bindingTooltipText = bindingText;
|
|
RefreshTooltip();
|
|
}
|
|
|
|
public void RefreshTooltip()
|
|
{
|
|
string widgetText = $"Current Binding: {widget.Text}";
|
|
if (_bindingTooltipText != null)
|
|
{
|
|
widgetText = $"{widgetText}\r\n---\r\n{_bindingTooltipText}";
|
|
}
|
|
|
|
widgetText = $"{widgetText}\r\n---\r\n{WidgetTooltipText}";
|
|
_tooltip.SetToolTip(widget, widgetText);
|
|
}
|
|
|
|
private void DropdownMenu_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
|
{
|
|
// suppress handling of ALT keys, so that we can receive them as binding modifiers
|
|
if (e.KeyCode == Keys.Menu)
|
|
{
|
|
e.IsInputKey = true;
|
|
}
|
|
}
|
|
|
|
public void TabNext()
|
|
{
|
|
Parent.SelectNextControl(btnSpecial, true, true, true, true);
|
|
}
|
|
|
|
private readonly ContextMenuStrip _dropdownMenu;
|
|
|
|
public bool AutoTab { get => widget.AutoTab; set => widget.AutoTab = value; }
|
|
public string WidgetName { get => widget.WidgetName; set => widget.WidgetName = value; }
|
|
public string Bindings { get => widget.Bindings; set => widget.Bindings = value; }
|
|
|
|
public void Clear()
|
|
{
|
|
widget.ClearAll();
|
|
}
|
|
|
|
private void BtnSpecial_Click(object sender, EventArgs e)
|
|
{
|
|
_dropdownMenu.Show(MousePosition);
|
|
}
|
|
|
|
private void DropdownMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
|
{
|
|
Input.ModifierKey mods = new Input.ModifierKey();
|
|
|
|
if ((ModifierKeys & Keys.Shift) != 0)
|
|
{
|
|
mods |= Input.ModifierKey.Shift;
|
|
}
|
|
|
|
if ((ModifierKeys & Keys.Control) != 0)
|
|
{
|
|
mods |= Input.ModifierKey.Control;
|
|
}
|
|
|
|
if ((ModifierKeys & Keys.Alt) != 0)
|
|
{
|
|
mods |= Input.ModifierKey.Alt;
|
|
}
|
|
|
|
var lb = new Input.LogicalButton(e.ClickedItem.Text, mods);
|
|
|
|
widget.SetBinding(lb.ToString());
|
|
}
|
|
}
|
|
}
|