using Robust.Shared.Analyzers; using Robust.Shared.GameObjects; using Robust.Shared.Map; namespace Content.Shared.DragDrop { /// /// This interface allows a local client to initiate dragging of the component's /// entity by mouse, for drag and drop interactions. /// [RequiresExplicitImplementation] public interface IDraggable { /// /// Invoked when an user is attempting to initiate a drag with /// this component's entity in range. It's fine to return true even if there /// wouldn't be any valid targets - just return true if this entity is in a /// "draggable" state. /// /// /// The information about the drag, such as who is doing it. /// /// True if the drag should be initiated, false otherwise. bool CanStartDrag(StartDragDropEvent args) { return true; } /// /// Invoked on entities visible to the user to check if this component's /// entity can be dropped on the indicated target entity. /// No need to check range / reachability in here. /// Returning true will cause the target entity to be highlighted as /// a potential target and allow dropping when in range. /// /// /// True if target is a valid target to be dropped on by this component's /// entity, false otherwise. /// bool CanDrop(CanDropEvent args); /// /// Invoked when this component's entity is being dropped on another. /// Other drag and drop interactions may be attempted if this one fails. /// /// /// The information about the drag, such as who is doing it. /// /// /// True if an interaction occurred and no further interaction should /// be processed for this drop, false otherwise. /// bool Drop(DragDropEvent args) { return false; } } [Virtual] public class StartDragDropEvent : HandledEntityEventArgs { /// /// Entity doing the drag and drop. /// public EntityUid User { get; } /// /// Entity that is being dragged. /// public EntityUid Dragged { get; } /// /// Creates a new instance of . /// /// The entity doing the drag and drop. /// The entity that is being dragged and dropped. public StartDragDropEvent(EntityUid user, EntityUid dragged) { User = user; Dragged = dragged; } } [Virtual] public class CanDropEvent : StartDragDropEvent { /// /// The entity uid that /// is being dropped onto. /// public EntityUid Target { get; } /// /// Creates a new instance of . /// /// The entity doing the drag and drop. /// The entity that is being dragged and dropped. /// The entity that is being dropped onto. public CanDropEvent(EntityUid user, EntityUid dragged, EntityUid target) : base(user, dragged) { Target = target; } } [Virtual] public class DragDropEvent : CanDropEvent { /// /// The location where /// is being dropped. /// public EntityCoordinates DropLocation { get; } /// /// Creates a new instance of . /// /// The entity doing the drag and drop. /// The location where is being dropped. /// The entity that is being dragged and dropped. /// The entity that is being dropped onto. public DragDropEvent(EntityUid user, EntityCoordinates dropLocation, EntityUid dragged, EntityUid target) : base(user, dragged, target) { DropLocation = dropLocation; } } }