using Robust.Client.Input; using Robust.Client.Utility; using Robust.Shared.Maths; using System; namespace Robust.Client.UserInterface { public partial class Control { protected internal virtual void MouseEntered() { } protected internal virtual void MouseExited() { } protected internal virtual void MouseWheel(GUIMouseWheelEventArgs args) { } public event Action OnMouseDown; protected internal virtual void MouseDown(GUIMouseButtonEventArgs args) { OnMouseDown?.Invoke(args); } protected internal virtual void MouseUp(GUIMouseButtonEventArgs args) { } protected internal virtual void MouseMove(GUIMouseMoveEventArgs args) { } public event Action OnKeyDown; protected internal virtual void KeyDown(GUIKeyEventArgs args) { OnKeyDown?.Invoke(args); } protected internal virtual void KeyUp(GUIKeyEventArgs args) { } protected internal virtual void KeyHeld(GUIKeyEventArgs args) { } protected internal virtual void TextEntered(GUITextEventArgs args) { } } public class GUIKeyEventArgs : KeyEventArgs { /// /// The control spawning this event. /// public Control SourceControl { get; } public GUIKeyEventArgs(Control sourceControl, Keyboard.Key key, bool repeat, bool alt, bool control, bool shift, bool system) : base(key, repeat, alt, control, shift, system) { SourceControl = sourceControl; } } public class GUITextEventArgs : TextEventArgs { /// /// The control spawning this event. /// public Control SourceControl { get; } public GUITextEventArgs(Control sourceControl, uint codePoint) : base(codePoint) { SourceControl = sourceControl; } } public abstract class GUIMouseEventArgs : ModifierInputEventArgs { /// /// The control spawning this event. /// public Control SourceControl { get; internal set; } /// /// InputEventMouse.button_mask in Godot. /// Which mouse buttons are currently held maybe? /// public Mouse.ButtonMask ButtonMask { get; } /// /// Position of the mouse, relative to the screen. /// public Vector2 GlobalPosition { get; } public Vector2 GlobalPixelPosition { get; } /// /// Position of the mouse, relative to the current control. /// public Vector2 RelativePosition { get; internal set; } public Vector2 RelativePixelPosition { get; internal set; } protected GUIMouseEventArgs(Control sourceControl, Mouse.ButtonMask buttonMask, Vector2 globalPosition, Vector2 globalPixelPosition, Vector2 relativePosition, Vector2 relativePixelPosition, bool alt, bool control, bool shift, bool system) : base(alt, control, shift, system) { SourceControl = sourceControl; ButtonMask = buttonMask; GlobalPosition = globalPosition; RelativePosition = relativePosition; RelativePixelPosition = relativePixelPosition; GlobalPixelPosition = globalPixelPosition; } } public class GUIMouseButtonEventArgs : GUIMouseEventArgs { /// /// The mouse button that has been pressed or released. /// public Mouse.Button Button { get; } /// /// True if this action was a double click. /// Can't be true if this was a release event. /// public bool DoubleClick { get; } public GUIMouseButtonEventArgs(Mouse.Button button, bool doubleClick, Control sourceControl, Mouse.ButtonMask buttonMask, Vector2 globalPosition, Vector2 globalPixelPosition, Vector2 relativePosition, Vector2 relativePixelPosition, bool alt, bool control, bool shift, bool system) : base(sourceControl, buttonMask, globalPosition, globalPixelPosition, relativePosition, relativePixelPosition, alt, control, shift, system) { Button = button; DoubleClick = doubleClick; } } public class GUIMouseMoveEventArgs : GUIMouseEventArgs { /// /// The new position relative to the previous position. /// public Vector2 Relative { get; } // TODO: Godot's docs aren't exactly clear on what this is. // Speed how? /// /// The speed of the movement. /// public Vector2 Speed { get; } // ALL the parameters! public GUIMouseMoveEventArgs(Vector2 relative, Vector2 speed, Control sourceControl, Mouse.ButtonMask buttonMask, Vector2 globalPosition, Vector2 globalPixelPosition, Vector2 relativePosition, Vector2 relativePixelPosition, bool alt, bool control, bool shift, bool system) : base(sourceControl, buttonMask, globalPosition, globalPixelPosition, relativePosition, relativePixelPosition, alt, control, shift, system) { Relative = relative; Speed = speed; } } public class GUIMouseWheelEventArgs : GUIMouseEventArgs { public Vector2 Delta { get; } public GUIMouseWheelEventArgs(Vector2 delta, Control sourceControl, Mouse.ButtonMask buttonMask, Vector2 globalPosition, Vector2 globalPixelPosition, Vector2 relativePosition, Vector2 relativePixelPosition, bool alt, bool control, bool shift, bool system) : base(sourceControl, buttonMask, globalPosition, globalPixelPosition, relativePosition, relativePixelPosition, alt, control, shift, system) { Delta = delta; } } }