diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index 06f28c2879..5f92c934a4 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -44,7 +44,7 @@ namespace OpenRA.Widgets return base.LoseFocus(mi); } - public override bool HandleInputInner(MouseInput mi) + public override bool HandleMouseInput(MouseInput mi) { if (mi.Button != MouseButton.Left) return false; @@ -55,15 +55,27 @@ namespace OpenRA.Widgets // Only fire the onMouseUp order if we successfully lost focus, and were pressed if (Focused && mi.Event == MouseInputEvent.Up) { - var wasPressed = Depressed; - return (LoseFocus(mi) && wasPressed); + LoseFocus(mi); + return OnMouseUp(mi); } if (mi.Event == MouseInputEvent.Down) - Depressed = true; + { + // OnMouseDown returns false if the button shouldn't be pressed + if (!OnMouseDown(mi)) + Depressed = true; + else + LoseFocus(mi); + } + else if (mi.Event == MouseInputEvent.Move && Focused) + { Depressed = RenderBounds.Contains(mi.Location.X, mi.Location.Y); - + + // All widgets should recieve MouseMove events + OnMouseMove(mi); + } + return Depressed; } @@ -120,11 +132,9 @@ namespace OpenRA.Widgets public static void ShowDropPanel(Widget w, Widget panel, IEnumerable dismissAfter, Func onDismiss) { + // Mask to prevent any clicks from being sent to other widgets var fullscreenMask = new ContainerWidget(); - // Don't use initializers - breaks on mono 2.6.7 fullscreenMask.Bounds = new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height); - fullscreenMask.ClickThrough = false; - fullscreenMask.Visible = true; Widget.RootWidget.AddChild(fullscreenMask); Action HideDropDown = () => @@ -139,13 +149,12 @@ namespace OpenRA.Widgets fullscreenMask.OnMouseDown = mi => { if (onDismiss()) HideDropDown(); - return false; + return true; }; - + fullscreenMask.OnMouseUp = mi => true; + var oldBounds = panel.Bounds; panel.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, oldBounds.Width, oldBounds.Height); - panel.ClickThrough = false; - panel.Visible = true; panel.OnMouseUp = mi => true; foreach (var ww in dismissAfter) @@ -175,14 +184,11 @@ namespace OpenRA.Widgets dismissAfter.Add(ww); ww.ClickThrough = false; ww.IsVisible = () => true; - ww.OnMouseMove = mi => + ww.OnMouseMove = mi => items.Do(lw => { - items.Do(lw => - { - lw.Background = null; ww.Background = "dialog2"; - }); return true; - }; - + lw.Background = null; ww.Background = "dialog2"; + }); + dropDown.AddChild(ww); items.Add(ww); } diff --git a/OpenRA.Game/Widgets/ChatEntryWidget.cs b/OpenRA.Game/Widgets/ChatEntryWidget.cs index 0c0e0ed261..3a347b11e7 100755 --- a/OpenRA.Game/Widgets/ChatEntryWidget.cs +++ b/OpenRA.Game/Widgets/ChatEntryWidget.cs @@ -51,8 +51,6 @@ namespace OpenRA.Widgets return composing ? false : base.LoseFocus(mi); } - public override bool HandleInputInner(MouseInput mi) { return false; } - public override bool HandleKeyPressInner(KeyInput e) { if (e.Event == KeyInputEvent.Up) return false; diff --git a/OpenRA.Game/Widgets/CheckboxWidget.cs b/OpenRA.Game/Widgets/CheckboxWidget.cs index 28763a1b4d..dd286ef852 100644 --- a/OpenRA.Game/Widgets/CheckboxWidget.cs +++ b/OpenRA.Game/Widgets/CheckboxWidget.cs @@ -41,9 +41,13 @@ namespace OpenRA.Widgets new float2(rect.Left + 2, rect.Top + 2)); } - public override bool HandleInputInner(MouseInput mi) + public override bool HandleMouseInput(MouseInput mi) { - return mi.Button == MouseButton.Left; + // Checkboxes require lmb + if (mi.Button != MouseButton.Left) + return false; + + return base.HandleMouseInput(mi); } public CheckboxWidget() : base() { } diff --git a/OpenRA.Game/Widgets/MapPreviewWidget.cs b/OpenRA.Game/Widgets/MapPreviewWidget.cs index ab60f3ee77..53c5a0f6aa 100644 --- a/OpenRA.Game/Widgets/MapPreviewWidget.cs +++ b/OpenRA.Game/Widgets/MapPreviewWidget.cs @@ -33,8 +33,6 @@ namespace OpenRA.Widgets } public override Widget Clone() { return new MapPreviewWidget(this); } - public override bool HandleInputInner(MouseInput mi) { return true; } - public int2 ConvertToPreview(MapStub map, int2 point) { return new int2(MapRect.X + (int)(PreviewScale*(point.X - map.Bounds.Left)) , MapRect.Y + (int)(PreviewScale*(point.Y - map.Bounds.Top))); diff --git a/OpenRA.Game/Widgets/ScrollPanelWidget.cs b/OpenRA.Game/Widgets/ScrollPanelWidget.cs index f6aa8e13e5..5bc584c120 100644 --- a/OpenRA.Game/Widgets/ScrollPanelWidget.cs +++ b/OpenRA.Game/Widgets/ScrollPanelWidget.cs @@ -129,7 +129,8 @@ namespace OpenRA.Widgets } int2 lastMouseLocation; - public override bool HandleInputInner(MouseInput mi) + // TODO: ScrollPanelWidget doesn't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { if (mi.Button == MouseButton.WheelDown) { diff --git a/OpenRA.Game/Widgets/SliderWidget.cs b/OpenRA.Game/Widgets/SliderWidget.cs index 10cf3f2c28..3313dde325 100755 --- a/OpenRA.Game/Widgets/SliderWidget.cs +++ b/OpenRA.Game/Widgets/SliderWidget.cs @@ -63,7 +63,8 @@ namespace OpenRA.Widgets Offset = ((newOffset - Little) / Spread).Clamp(0f, 1f); } - public override bool HandleInputInner(MouseInput mi) + // TODO: SliderWidget doesn't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { if (mi.Button != MouseButton.Left) return false; diff --git a/OpenRA.Game/Widgets/TextFieldWidget.cs b/OpenRA.Game/Widgets/TextFieldWidget.cs index d7400a77a9..55bb0ab3d9 100644 --- a/OpenRA.Game/Widgets/TextFieldWidget.cs +++ b/OpenRA.Game/Widgets/TextFieldWidget.cs @@ -42,13 +42,14 @@ namespace OpenRA.Widgets return lose; } - public override bool HandleInputInner(MouseInput mi) + // TODO: TextFieldWidgets don't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { if (mi.Event == MouseInputEvent.Move) return false; // Lose focus if they click outside the box; return false so the next widget can grab this event - if (mi.Event == MouseInputEvent.Down && !RenderBounds.Contains(mi.Location.X, mi.Location.Y) && LoseFocus(mi)) + if (mi.Event == MouseInputEvent.Down && !RenderBounds.Contains(mi.Location) && LoseFocus(mi)) return false; if (mi.Event == MouseInputEvent.Down && !TakeFocus(mi)) diff --git a/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs b/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs index b6bb69dc4e..58a986e8c9 100755 --- a/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs +++ b/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs @@ -34,7 +34,8 @@ namespace OpenRA.Widgets protected ViewportScrollControllerWidget(ViewportScrollControllerWidget widget) : base(widget) {} public override void DrawInner( WorldRenderer wr ) {} - public override bool HandleInputInner(MouseInput mi) + // TODO: ViewportScrollController doesn't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { if (mi.Event == MouseInputEvent.Move && (mi.Button == MouseButton.Middle || mi.Button == (MouseButton.Left | MouseButton.Right))) diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index 8c8e2bc1a0..f0200cd4fc 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -41,7 +41,7 @@ namespace OpenRA.Widgets // Common Funcs that most widgets will want public Func OnMouseDown = mi => false; public Func OnMouseUp = mi => false; - public Func OnMouseMove = mi => false; + public Action OnMouseMove = mi => {}; public Func OnKeyPress = e => false; public Func IsVisible; @@ -222,22 +222,21 @@ namespace OpenRA.Widgets if (child.HandleMouseInputOuter(mi)) return true; - // Do any widgety behavior (button click etc) - // Return false if it can't handle any user actions - if (!HandleInputInner(mi)) - return false; - - // Apply any special logic added by delegates; they return true if they caught the input - if (mi.Event == MouseInputEvent.Down && OnMouseDown(mi)) return true; - if (mi.Event == MouseInputEvent.Up && OnMouseUp(mi)) return true; - if (mi.Event == MouseInputEvent.Move && OnMouseMove(mi)) return true; - - return true; + return HandleMouseInput(mi); } // Hack: Don't eat mouse input that others want // TODO: Solve this properly - public virtual bool HandleInputInner(MouseInput mi) { return !ClickThrough && mi.Button == MouseButton.Left && mi.Event != MouseInputEvent.Move; } + public virtual bool HandleMouseInput(MouseInput mi) + { + // Apply any special logic added by delegates; they return true if they caught the input + if (mi.Event == MouseInputEvent.Down && OnMouseDown(mi)) return true; + if (mi.Event == MouseInputEvent.Up && OnMouseUp(mi)) return true; + if (mi.Event == MouseInputEvent.Move) + OnMouseMove(mi); + + return false; + } public virtual bool HandleKeyPressInner(KeyInput e) { return false; } public virtual bool HandleKeyPressOuter(KeyInput e) diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index 9ea9ab052e..a1f86d7e25 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -47,7 +47,8 @@ namespace OpenRA.Widgets float2 dragStart, dragEnd; - public override bool HandleInputInner(MouseInput mi) + // TODO: WorldInteractionController doesn't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { var xy = Game.viewport.ViewToWorld(mi); if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Down) @@ -75,6 +76,7 @@ namespace OpenRA.Widgets if (mi.Button == MouseButton.Right && mi.Event == MouseInputEvent.Down) ApplyOrders(world, xy, mi); + return true; } diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 709c603a08..e75024e282 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -157,7 +157,8 @@ namespace OpenRA.Mods.RA.Widgets return DoBuildingHotkey(Char.ToLowerInvariant(e.KeyChar), world); } - public override bool HandleInputInner(MouseInput mi) + // TODO: BuildPaletteWidget doesn't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { if (mi.Event != MouseInputEvent.Down) return false; diff --git a/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs b/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs index a3a2a65a1f..1b9ed22c90 100755 --- a/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs +++ b/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs @@ -84,7 +84,8 @@ namespace OpenRA.Mods.RA.Widgets return CursorProvider.HasCursorSequence(cursor+"-minimap") ? cursor+"-minimap" : cursor; } - public override bool HandleInputInner(MouseInput mi) + // TODO: RadarBinWidget doesn't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { if (!hasRadar || radarAnimating) return false; // we're not set up for this. @@ -98,7 +99,6 @@ namespace OpenRA.Mods.RA.Widgets if (mi.Event == MouseInputEvent.Down && mi.Button == MouseButton.Right) { // fake a mousedown/mouseup here - var fakemi = new MouseInput { Event = MouseInputEvent.Down, @@ -110,9 +110,9 @@ namespace OpenRA.Mods.RA.Widgets if (WorldInteractionController != null) { var controller = Widget.RootWidget.GetWidget(WorldInteractionController); - controller.HandleInputInner(fakemi); + controller.HandleMouseInput(fakemi); fakemi.Event = MouseInputEvent.Up; - controller.HandleInputInner(fakemi); + controller.HandleMouseInput(fakemi); } } diff --git a/OpenRA.Mods.RA/Widgets/SpecialPowerBinWidget.cs b/OpenRA.Mods.RA/Widgets/SpecialPowerBinWidget.cs index 9965df00e6..b4fae10781 100755 --- a/OpenRA.Mods.RA/Widgets/SpecialPowerBinWidget.cs +++ b/OpenRA.Mods.RA/Widgets/SpecialPowerBinWidget.cs @@ -53,7 +53,8 @@ namespace OpenRA.Mods.RA.Widgets get { return buttons.Any() ? buttons.Select(b => b.First).Aggregate(Rectangle.Union) : Bounds; } } - public override bool HandleInputInner(MouseInput mi) + // TODO: SpecialPowerBin doesn't support delegate methods for mouse input + public override bool HandleMouseInput(MouseInput mi) { if (mi.Event == MouseInputEvent.Down) {