diff --git a/OpenRA.Game/Widgets/BackgroundWidget.cs b/OpenRA.Game/Widgets/BackgroundWidget.cs index fb6ee8cd94..a4fd1321ec 100644 --- a/OpenRA.Game/Widgets/BackgroundWidget.cs +++ b/OpenRA.Game/Widgets/BackgroundWidget.cs @@ -8,12 +8,15 @@ */ #endregion +using System.Drawing; + namespace OpenRA.Widgets { public class BackgroundWidget : Widget { public readonly string Background = "dialog"; public readonly bool ClickThrough = false; + public readonly bool Draggable = false; public override void Draw() { @@ -22,9 +25,33 @@ namespace OpenRA.Widgets public BackgroundWidget() : base() { } + bool moving; + int2? prevMouseLocation; + public override bool HandleMouseInput(MouseInput mi) { - return !ClickThrough; + if (ClickThrough) return false; + if (!Draggable || moving && (!TakeFocus(mi) || mi.Button != MouseButton.Left)) return true; + if (prevMouseLocation == null) + prevMouseLocation = mi.Location; + var vec = mi.Location - (int2)prevMouseLocation; + prevMouseLocation = mi.Location; + switch (mi.Event) + { + case MouseInputEvent.Up: + moving = false; + LoseFocus(mi); + break; + case MouseInputEvent.Down: + moving = true; + Bounds = new Rectangle(Bounds.X + vec.X, Bounds.Y + vec.Y, Bounds.Width, Bounds.Height); + break; + case MouseInputEvent.Move: + if (moving) + Bounds = new Rectangle(Bounds.X + vec.X, Bounds.Y + vec.Y, Bounds.Width, Bounds.Height); + break; + } + return true; } protected BackgroundWidget(BackgroundWidget other) @@ -32,6 +59,7 @@ namespace OpenRA.Widgets { Background = other.Background; ClickThrough = other.ClickThrough; + Draggable = other.Draggable; } public override Widget Clone() { return new BackgroundWidget(this); }