-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDragAndDrop.cs
130 lines (105 loc) · 3.55 KB
/
DragAndDrop.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
namespace DockGUI
{
public static class DragAndDrop
{
private static IDraggable _draggingObject;
private static IDroppable _droppingObject;
private static DragAndDropState _state = DragAndDropState.None;
private static List<IDroppable> _droppables;
public static IDraggable DraggingObject => _draggingObject;
public static IDroppable DroppingObject => _droppingObject;
public static DragAndDropState State => _state;
public enum DragAndDropState
{
None,
Dragging,
Dropping
}
public static void StartDrag(IDraggable target)
{
_draggingObject = target;
_draggingObject.TargetElement.CaptureMouse();
RefreshDroppables();
}
private static VisualElement GetRootElement(VisualElement refElement)
{
VisualElement nextParent = refElement.parent;
VisualElement parent = nextParent ?? refElement;
while (nextParent != null)
{
parent = nextParent;
nextParent = nextParent.parent;
}
return parent;
}
public static void DroppableEntered(IDroppable target)
{
if (_state == DragAndDropState.Dragging)
{
// _draggingObject.OnDroppableEntered(_draggingObject);
_droppingObject = target;
}
}
public static void DragUpdate()
{
// _draggingObject.OnDrag();
}
/// <summary>
/// Unsuccessful drag
/// </summary>
public static void EndDrag()
{
// _draggingObject.OnDragEnd();
_draggingObject = null;
}
public static List<IDroppable> GetAllDroppables(VisualElement rootElement)
{
List<IDroppable> result = new List<IDroppable>();
var children = rootElement.Children();
foreach (var child in rootElement.Children())
{
if (child.visible)
{
if (child is IDroppable droppable)
{
result.Add(droppable);
}
result.AddRange(GetAllDroppables(child));
}
}
return result;
}
public static List<IDroppable> GetDroppablesUnderMouse(Vector2 mousePos)
{
List<IDroppable> result = new List<IDroppable>();
foreach (var droppable in _droppables)
{
if (droppable.TargetElement.worldBound.Contains(mousePos))
{
result.Add(droppable);
}
}
return result;
}
public static void RefreshDroppables()
{
_droppables = GetAllDroppables(GetRootElement(_draggingObject.TargetElement));
}
}
public interface IDraggable
{
VisualElement TargetElement { get; }
// void OnDrag();
// void OnDroppableEntered(IDraggable source);
// void OnDragEnd();
}
public interface IDroppable
{
VisualElement TargetElement { get; }
}
}