BizHawk/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualpadsTool.cs

225 lines
5.2 KiB
C#
Raw Normal View History

2014-06-22 13:58:12 +00:00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;
2014-06-22 13:58:12 +00:00
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk
{
public partial class VirtualpadTool : Form, IToolForm
{
private int _defaultWidth;
private int _defaultHeight;
private bool _readOnly = false;
2014-06-22 13:58:12 +00:00
2014-06-22 15:05:37 +00:00
private List<VirtualPad> Pads
2014-06-22 13:58:12 +00:00
{
get
{
return ControllerBox.Controls
2014-06-22 15:05:37 +00:00
.OfType<VirtualPad>()
2014-06-22 13:58:12 +00:00
.ToList();
}
}
public bool Readonly
{
get
{
return _readOnly;
}
set
{
_readOnly = value;
Pads.ForEach(p => p.ReadOnly = value);
}
}
2014-06-22 13:58:12 +00:00
public VirtualpadTool()
{
InitializeComponent();
2014-06-22 15:05:37 +00:00
Closing += (o, e) => SaveConfigSettings();
TopMost = Global.Config.VirtualPadSettings.TopMost;
2014-06-22 13:58:12 +00:00
}
private void VirtualpadTool_Load(object sender, EventArgs e)
{
_defaultWidth = Size.Width;
_defaultHeight = Size.Height;
if (Global.Config.VirtualPadSettings.UseWindowPosition)
{
Location = Global.Config.VirtualPadSettings.WindowPosition;
}
if (Global.Config.VirtualPadSettings.UseWindowPosition)
{
Size = Global.Config.VirtualPadSettings.WindowSize;
}
CreatePads();
}
public void ClearVirtualPadHolds()
{
2014-06-24 16:36:19 +00:00
Pads.ForEach(pad => pad.Clear());
2014-06-22 13:58:12 +00:00
}
public void BumpAnalogValue(int? dx, int? dy) // TODO: multi-player
{
}
private void CreatePads()
{
ControllerBox.Controls.Clear();
var schemaType = Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(IVirtualPadSchema)
.IsAssignableFrom(t) && t.GetCustomAttributes(false)
.OfType<SchemaAttributes>()
.Any())
.FirstOrDefault(t => t.GetCustomAttributes(false)
.OfType<SchemaAttributes>()
.First().SystemId == Global.Emulator.SystemId);
if (schemaType != null)
2014-06-22 13:58:12 +00:00
{
var pads = (Activator.CreateInstance(schemaType) as IVirtualPadSchema).GetPads() ?? Enumerable.Empty<VirtualPad>();
if (pads.Any())
{
ControllerBox.Controls.AddRange(pads.Reverse().ToArray());
}
2014-06-22 13:58:12 +00:00
}
}
2014-06-22 15:05:37 +00:00
private void SaveConfigSettings()
{
Global.Config.VirtualPadSettings.Wndx = Location.X;
Global.Config.VirtualPadSettings.Wndy = Location.Y;
Global.Config.VirtualPadSettings.Width = Right - Left;
Global.Config.VirtualPadSettings.Height = Bottom - Top;
}
2014-06-22 13:58:12 +00:00
private void RefreshFloatingWindowControl()
{
Owner = Global.Config.VirtualPadSettings.FloatingWindow ? null : GlobalWin.MainForm;
}
#region IToolForm Implementation
public bool AskSave() { return true; }
public bool UpdateBefore { get { return false; } }
public void Restart()
{
if (!IsHandleCreated || IsDisposed)
{
return;
}
CreatePads();
}
public void UpdateValues()
{
if (!IsHandleCreated || IsDisposed)
{
return;
}
2014-06-24 17:30:14 +00:00
if (Global.MovieSession.Movie.IsPlaying && !Global.MovieSession.Movie.IsFinished && Global.Emulator.Frame > 0)
2014-06-22 13:58:12 +00:00
{
Readonly = true;
Pads.ForEach(p => p.Set(Global.MovieSession.CurrentInput));
2014-06-22 13:58:12 +00:00
}
else
{
Readonly = false;
}
2014-06-24 16:36:19 +00:00
2014-06-26 20:37:44 +00:00
if (!Readonly && !Global.Config.VirtualPadSticky)
{
Pads.ForEach(pad => pad.Clear());
}
2014-06-22 13:58:12 +00:00
}
#endregion
#region Events
#region Menu
private void OptionsSubMenu_DropDownOpened(object sender, EventArgs e)
{
AutoloadMenuItem.Checked = Global.Config.AutoloadVirtualPad;
SaveWindowPositionMenuItem.Checked = Global.Config.VirtualPadSettings.SaveWindowPosition;
AlwaysOnTopMenuItem.Checked = Global.Config.VirtualPadSettings.TopMost;
FloatingWindowMenuItem.Checked = Global.Config.VirtualPadSettings.FloatingWindow;
}
private void AutoloadMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoloadVirtualPad ^= true;
}
private void SaveWindowPositionMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VirtualPadSettings.SaveWindowPosition ^= true;
}
private void AlwaysOnTopMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VirtualPadSettings.TopMost ^= true;
TopMost = Global.Config.VirtualPadSettings.TopMost;
}
private void FloatingWindowMenuItem_Click(object sender, EventArgs e)
{
Global.Config.VirtualPadSettings.FloatingWindow ^= true;
RefreshFloatingWindowControl();
}
private void RestoreDefaultSettingsMenuItem_Click(object sender, EventArgs e)
{
Size = new Size(_defaultWidth, _defaultHeight);
Global.Config.VirtualPadSettings.SaveWindowPosition = true;
Global.Config.VirtualPadSettings.TopMost = TopMost = false;
Global.Config.VirtualPadSettings.FloatingWindow = false;
Global.Config.VirtualPadMultiplayerMode = false;
}
private void ExitMenuItem_Click(object sender, EventArgs e)
{
Close();
}
2014-06-22 15:05:37 +00:00
private void PadsSubMenu_DropDownOpened(object sender, EventArgs e)
{
2014-06-26 20:24:30 +00:00
StickyMenuItem.Checked = Global.Config.VirtualPadSticky;
2014-06-22 15:05:37 +00:00
}
2014-06-22 13:58:12 +00:00
private void ClearAllMenuItem_Click(object sender, EventArgs e)
{
ClearVirtualPadHolds();
}
2014-06-22 15:05:37 +00:00
private void StickyMenuItem_Click(object sender, EventArgs e)
{
2014-06-26 20:24:30 +00:00
Global.Config.VirtualPadSticky ^= true;
2014-06-22 15:05:37 +00:00
}
2014-06-22 13:58:12 +00:00
#endregion
#endregion
}
}