diff --git a/BizHawk.MultiClient/movie/InputAdapters.cs b/BizHawk.MultiClient/movie/InputAdapters.cs index 26351ec336..20fe124929 100644 --- a/BizHawk.MultiClient/movie/InputAdapters.cs +++ b/BizHawk.MultiClient/movie/InputAdapters.cs @@ -201,9 +201,11 @@ namespace BizHawk.MultiClient // if SetFloat() is called (typically virtual pads), then that float will entirely override the Source input // otherwise, the source is passed thru. WorkingDictionary FloatSet = new WorkingDictionary(); - public void SetFloat(string name, float value) + public void SetFloat(string name, float? value) { - FloatSet[name] = value; + if (value.HasValue) + FloatSet[name] = value; + else FloatSet.Remove(name); } public float GetFloat(string name) { diff --git a/BizHawk.MultiClient/tools/VirtualPads/AnalogControlPanel.cs b/BizHawk.MultiClient/tools/VirtualPads/AnalogControlPanel.cs index d042c379ba..6478f1145b 100644 --- a/BizHawk.MultiClient/tools/VirtualPads/AnalogControlPanel.cs +++ b/BizHawk.MultiClient/tools/VirtualPads/AnalogControlPanel.cs @@ -8,6 +8,8 @@ namespace BizHawk.MultiClient public int X = 0; public int Y = 0; + public bool HasValue { get; private set; } + private readonly Brush WhiteBrush = Brushes.White; private readonly Brush BlackBrush = Brushes.Black; private readonly Brush GrayBrush = Brushes.LightGray; @@ -31,8 +33,6 @@ namespace BizHawk.MultiClient SetStyle(ControlStyles.Opaque, true); BackColor = Color.Gray; Paint += AnalogControlPanel_Paint; - MouseClick += Event_MouseClick; - MouseMove += Event_MouseMove; _white_pen = new Pen(WhiteBrush); BlackPen = new Pen(BlackBrush); GrayPen = new Pen(GrayBrush); @@ -73,38 +73,76 @@ namespace BizHawk.MultiClient e.Graphics.DrawLine(BlackPen, 0, 63, 127, 63); //Line - e.Graphics.DrawLine(BluePen, 64, 63, RealToGFX(X), 127 - RealToGFX(Y)); - e.Graphics.DrawImage(dot, RealToGFX(X) - 3, 127 - RealToGFX(Y) - 3); - + if (HasValue) + { + e.Graphics.DrawLine(BluePen, 64, 63, RealToGFX(X), 127 - RealToGFX(Y)); + e.Graphics.DrawImage(dot, RealToGFX(X) - 3, 127 - RealToGFX(Y) - 3); + } } } - private void Event_MouseClick(object sender, MouseEventArgs e) + protected override void OnMouseMove(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { X = GFXToReal(e.X - 64); Y = GFXToReal(-(e.Y - 63)); + HasValue = true; + } + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + Clear(); } Refresh(); } - private void Event_MouseMove(object sender, MouseEventArgs e) + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + if (Capture) + Capture = false; + } + + + protected override void WndProc(ref Message m) + { + if (m.Msg == 0x007B) //WM_CONTEXTMENU + { + //dont let parent controls get this.. we handle the right mouse button ourselves + return; + } + base.WndProc(ref m); + } + + protected override void OnMouseDown(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { X = GFXToReal(e.X - 64); Y = GFXToReal(-(e.Y - 63)); + HasValue = true; + } + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + Clear(); } Refresh(); } + + void Clear() + { + X = Y = 0; + HasValue = false; + } + public void SetPosition(int Xval, int Yval) { X = Xval; Y = Yval; + HasValue = true; Refresh(); } diff --git a/BizHawk.MultiClient/tools/VirtualPads/VirtualPadN64.cs b/BizHawk.MultiClient/tools/VirtualPads/VirtualPadN64.cs index 0c87fe933f..fb79447da2 100644 --- a/BizHawk.MultiClient/tools/VirtualPads/VirtualPadN64.cs +++ b/BizHawk.MultiClient/tools/VirtualPads/VirtualPadN64.cs @@ -121,7 +121,7 @@ namespace BizHawk.MultiClient { y = Int32.Parse(buttons.Substring(19, 4)); } - set_analog(x, y); + set_analog(true, x, y); } public string GetMnemonic() @@ -217,30 +217,32 @@ namespace BizHawk.MultiClient private void AnalogControl1_MouseClick(object sender, MouseEventArgs e) { - set_analog(AnalogControl1.X, AnalogControl1.Y); + set_analog(AnalogControl1.HasValue, AnalogControl1.X, AnalogControl1.Y); } private void AnalogControl1_MouseMove(object sender, MouseEventArgs e) { - set_analog(AnalogControl1.X, AnalogControl1.Y); + set_analog(AnalogControl1.HasValue, AnalogControl1.X, AnalogControl1.Y); } private void ManualX_ValueChanged(object sender, EventArgs e) { if (ManualX.Value != old_X) - set_analog((int)ManualX.Value, old_Y); + set_analog(AnalogControl1.HasValue, (int)ManualX.Value, old_Y); } private void ManualY_ValueChanged(object sender, EventArgs e) { if (ManualY.Value != old_Y) - set_analog(old_X, (int)ManualY.Value); + set_analog(AnalogControl1.HasValue, old_X, (int)ManualY.Value); } - public void set_analog(int X, int Y) + public void set_analog(bool hasValue, int X, int Y) { - Global.StickyXORAdapter.SetFloat(Controller + " X Axis", X); - Global.StickyXORAdapter.SetFloat(Controller + " Y Axis", Y); + int? x = hasValue ? X : (int?)null; + int? y = hasValue ? Y : (int?)null; + Global.StickyXORAdapter.SetFloat(Controller + " X Axis", x); + Global.StickyXORAdapter.SetFloat(Controller + " Y Axis", y); AnalogControl1.X = X; AnalogControl1.Y = Y;