diff --git a/Examples/ReorderableList/ReorderableList.unity b/Examples/ReorderableList/ReorderableList.unity index b8e11c9..3a363c6 100644 --- a/Examples/ReorderableList/ReorderableList.unity +++ b/Examples/ReorderableList/ReorderableList.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1} + m_IndirectSpecularColor: {r: 0.3731193, g: 0.38073996, b: 0.35872692, a: 1} --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 @@ -189,6 +189,8 @@ MonoBehaviour: IsDraggable: 1 CloneDraggedObject: 1 IsDropable: 0 + IsDisplacable: 0 + maxItems: 2147483647 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -209,6 +211,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &7473526 MonoBehaviour: m_ObjectHideFlags: 0 @@ -321,7 +343,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0.0000127977155} + m_AnchoredPosition: {x: 0, y: 0.000008085421} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!114 &32192511 @@ -520,9 +542,11 @@ MonoBehaviour: Is Draggable = true - Clone Dragged Object = false + IsDroppable = true - Is Droppable = false' + MaxItems = 4, IsDisplacable = True + + Clone Dragged Object = false' --- !u!222 &177188057 CanvasRenderer: m_ObjectHideFlags: 0 @@ -544,7 +568,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -584,7 +608,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0.0000127977155} + m_AnchoredPosition: {x: 0, y: 0.000015258789} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!114 &178427160 @@ -909,7 +933,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -1230,7 +1254,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -1472,6 +1496,8 @@ MonoBehaviour: IsDraggable: 1 CloneDraggedObject: 0 IsDropable: 1 + IsDisplacable: 0 + maxItems: 4 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -1492,6 +1518,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &437265566 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1750,6 +1796,8 @@ MonoBehaviour: IsDraggable: 1 CloneDraggedObject: 0 IsDropable: 1 + IsDisplacable: 0 + maxItems: 2147483647 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -1770,6 +1818,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &500962420 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1970,7 +2038,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0.0000076293945} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!114 &622440035 @@ -2220,7 +2288,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0.0000069301664} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0.5} --- !u!114 &670178503 @@ -2330,6 +2398,10 @@ MonoBehaviour: Is Draggable = true + IsDroppable = true + + MaxItems = 4, IsDisplacable = False + Clone Dragged Object = false Is Droppable = true' @@ -2354,7 +2426,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -2542,7 +2614,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -2760,7 +2832,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -2972,6 +3044,8 @@ MonoBehaviour: IsDraggable: 1 CloneDraggedObject: 0 IsDropable: 1 + IsDisplacable: 0 + maxItems: 2147483647 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -2992,6 +3066,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &835752199 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3206,7 +3300,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -3266,6 +3360,8 @@ MonoBehaviour: IsDraggable: 0 CloneDraggedObject: 0 IsDropable: 1 + IsDisplacable: 0 + maxItems: 2147483647 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -3286,6 +3382,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &962628936 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3564,8 +3680,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 75} - m_SizeDelta: {x: 0, y: -150} + m_AnchoredPosition: {x: 0, y: 35.6} + m_SizeDelta: {x: 0, y: -111.2} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1036076373 MonoBehaviour: @@ -3584,7 +3700,7 @@ MonoBehaviour: m_Top: 0 m_Bottom: 0 m_ChildAlignment: 0 - m_Spacing: 50 + m_Spacing: 40 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 m_ChildControlWidth: 1 @@ -3685,7 +3801,7 @@ MonoBehaviour: m_MinWidth: -1 m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: 88.49 + m_PreferredHeight: 180 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -4482,7 +4598,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0.0000076293945} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!114 &1527828930 @@ -5203,7 +5319,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 138} + m_SizeDelta: {x: 0, y: 91.2} m_Pivot: {x: 0.5, y: 0} --- !u!114 &1739629088 MonoBehaviour: @@ -5228,9 +5344,9 @@ MonoBehaviour: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} m_FontSize: 20 m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 + m_BestFit: 1 + m_MinSize: 1 + m_MaxSize: 300 m_Alignment: 4 m_AlignByGeometry: 0 m_RichText: 1 @@ -5292,7 +5408,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0.0000127977155} + m_AnchoredPosition: {x: 0, y: 0.000038146973} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!114 &1789326610 @@ -5561,7 +5677,9 @@ MonoBehaviour: DraggableArea: {fileID: 853621234} IsDraggable: 1 CloneDraggedObject: 0 - IsDropable: 0 + IsDropable: 1 + IsDisplacable: 0 + maxItems: 4 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -5582,6 +5700,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &1893066122 MonoBehaviour: m_ObjectHideFlags: 0 @@ -6016,6 +6154,8 @@ MonoBehaviour: IsDraggable: 1 CloneDraggedObject: 1 IsDropable: 0 + IsDisplacable: 0 + maxItems: 2147483647 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -6036,6 +6176,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &1960731673 MonoBehaviour: m_ObjectHideFlags: 0 @@ -6256,6 +6416,8 @@ MonoBehaviour: IsDraggable: 1 CloneDraggedObject: 1 IsDropable: 0 + IsDisplacable: 0 + maxItems: 2147483647 OnElementDropped: m_PersistentCalls: m_Calls: [] @@ -6276,6 +6438,26 @@ MonoBehaviour: m_Calls: [] m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFrom: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedTo: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedFromReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + OnElementDisplacedToReturned: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.Extensions.ReorderableList+ReorderableListHandler, + Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &2076596391 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Scripts/Controls/ReorderableList/ReorderableList.cs b/Scripts/Controls/ReorderableList/ReorderableList.cs index 1f0da59..30e256e 100644 --- a/Scripts/Controls/ReorderableList/ReorderableList.cs +++ b/Scripts/Controls/ReorderableList/ReorderableList.cs @@ -6,6 +6,7 @@ using UnityEngine.Events; namespace UnityEngine.UI.Extensions { + [RequireComponent(typeof(RectTransform)), DisallowMultipleComponent] [AddComponentMenu("UI/Extensions/Re-orderable list")] public class ReorderableList : MonoBehaviour @@ -17,18 +18,29 @@ namespace UnityEngine.UI.Extensions [Tooltip("Can items be dragged from the container?")] public bool IsDraggable = true; + [Tooltip("Should the draggable components be removed or cloned?")] public bool CloneDraggedObject = false; [Tooltip("Can new draggable items be dropped in to the container?")] public bool IsDropable = true; - + + [Tooltip("Should dropped items displace a current item if the list is full?\n " + + "Depending on the dropped items origin list, the displaced item may be added, dropped in space or deleted.")] + public bool IsDisplacable = false; + + public int maxItems = int.MaxValue; + [Header("UI Re-orderable Events")] public ReorderableListHandler OnElementDropped = new ReorderableListHandler(); public ReorderableListHandler OnElementGrabbed = new ReorderableListHandler(); public ReorderableListHandler OnElementRemoved = new ReorderableListHandler(); public ReorderableListHandler OnElementAdded = new ReorderableListHandler(); + public ReorderableListHandler OnElementDisplacedFrom = new ReorderableListHandler(); + public ReorderableListHandler OnElementDisplacedTo = new ReorderableListHandler(); + public ReorderableListHandler OnElementDisplacedFromReturned = new ReorderableListHandler(); + public ReorderableListHandler OnElementDisplacedToReturned = new ReorderableListHandler(); private RectTransform _content; private ReorderableListContent _listContent; @@ -49,7 +61,7 @@ namespace UnityEngine.UI.Extensions { Transform t = transform; Canvas canvas = null; - + int lvlLimit = 100; int lvl = 0; @@ -66,17 +78,18 @@ namespace UnityEngine.UI.Extensions } return canvas; } - + /// /// Refresh related list content /// public void Refresh() { + Destroy(_listContent); _listContent = ContentLayout.gameObject.AddComponent(); _listContent.Init(this); } - private void Awake() + private void Start() { if (ContentLayout == null) @@ -97,6 +110,7 @@ namespace UnityEngine.UI.Extensions Refresh(); } + #region Nested type: ReorderableListEventStruct [Serializable] @@ -118,6 +132,7 @@ namespace UnityEngine.UI.Extensions #endregion + #region Nested type: ReorderableListHandler [Serializable] @@ -133,4 +148,4 @@ namespace UnityEngine.UI.Extensions #endregion } -} \ No newline at end of file +} diff --git a/Scripts/Controls/ReorderableList/ReorderableListElement.cs b/Scripts/Controls/ReorderableList/ReorderableListElement.cs index fc01c40..4c227fe 100644 --- a/Scripts/Controls/ReorderableList/ReorderableListElement.cs +++ b/Scripts/Controls/ReorderableList/ReorderableListElement.cs @@ -22,21 +22,33 @@ namespace UnityEngine.UI.Extensions private readonly List _raycastResults = new List(); private ReorderableList _currentReorderableListRaycasted; + + private int _fromIndex; private RectTransform _draggingObject; private LayoutElement _draggingObjectLE; private Vector2 _draggingObjectOriginalSize; + private RectTransform _fakeElement; private LayoutElement _fakeElementLE; - private int _fromIndex; + + private int _displacedFromIndex; + private RectTransform _displacedObject; + private LayoutElement _displacedObjectLE; + private Vector2 _displacedObjectOriginalSize; + private ReorderableList _displacedObjectOriginList; + private bool _isDragging; private RectTransform _rect; private ReorderableList _reorderableList; + private CanvasGroup _canvasGroup; internal bool isValid; + #region IBeginDragHandler Members public void OnBeginDrag(PointerEventData eventData) { + _canvasGroup.blocksRaycasts = false; isValid = true; if (_reorderableList == null) return; @@ -48,22 +60,23 @@ namespace UnityEngine.UI.Extensions return; } - //If CloneDraggedObject just set draggingObject to this gameobject + //If not CloneDraggedObject just set draggingObject to this gameobject if (_reorderableList.CloneDraggedObject == false) { _draggingObject = _rect; _fromIndex = _rect.GetSiblingIndex(); + _displacedFromIndex = -1; //Send OnElementRemoved Event if (_reorderableList.OnElementRemoved != null) { _reorderableList.OnElementRemoved.Invoke(new ReorderableList.ReorderableListEventStruct - { - DroppedObject = _draggingObject.gameObject, - IsAClone = _reorderableList.CloneDraggedObject, - SourceObject = _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject, - FromList = _reorderableList, - FromIndex = _fromIndex, - }); + { + DroppedObject = _draggingObject.gameObject, + IsAClone = _reorderableList.CloneDraggedObject, + SourceObject = _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject, + FromList = _reorderableList, + FromIndex = _fromIndex, + }); } if (isValid == false) { @@ -71,9 +84,9 @@ namespace UnityEngine.UI.Extensions return; } } - //Else Duplicate else { + //Else Duplicate GameObject clone = (GameObject)Instantiate(gameObject); _draggingObject = clone.GetComponent(); } @@ -83,6 +96,7 @@ namespace UnityEngine.UI.Extensions _draggingObjectLE = _draggingObject.GetComponent(); _draggingObject.SetParent(_reorderableList.DraggableArea, true); _draggingObject.SetAsLastSibling(); + _reorderableList.Refresh(); //Create a fake element for previewing placement _fakeElement = new GameObject("Fake").AddComponent(); @@ -94,13 +108,13 @@ namespace UnityEngine.UI.Extensions if (_reorderableList.OnElementGrabbed != null) { _reorderableList.OnElementGrabbed.Invoke(new ReorderableList.ReorderableListEventStruct - { - DroppedObject = _draggingObject.gameObject, - IsAClone = _reorderableList.CloneDraggedObject, - SourceObject = _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject, - FromList = _reorderableList, - FromIndex = _fromIndex, - }); + { + DroppedObject = _draggingObject.gameObject, + IsAClone = _reorderableList.CloneDraggedObject, + SourceObject = _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject, + FromList = _reorderableList, + FromIndex = _fromIndex, + }); if (!isValid) { @@ -114,6 +128,7 @@ namespace UnityEngine.UI.Extensions #endregion + #region IDragHandler Members public void OnDrag(PointerEventData eventData) @@ -132,6 +147,8 @@ namespace UnityEngine.UI.Extensions canvas.renderMode != RenderMode.ScreenSpaceOverlay ? canvas.worldCamera : null, out worldPoint); _draggingObject.position = worldPoint; + ReorderableList _oldReorderableListRaycasted = _currentReorderableListRaycasted; + //Check everything under the cursor to find a ReorderableList EventSystem.current.RaycastAll(eventData, _raycastResults); for (int i = 0; i < _raycastResults.Count; i++) @@ -144,17 +161,28 @@ namespace UnityEngine.UI.Extensions } //If nothing found or the list is not dropable, put the fake element outsite - if (_currentReorderableListRaycasted == null || _currentReorderableListRaycasted.IsDropable == false) + if (_currentReorderableListRaycasted == null || _currentReorderableListRaycasted.IsDropable == false + || (_oldReorderableListRaycasted != _reorderableList && !IsTransferable) + || ((_fakeElement.parent == _currentReorderableListRaycasted.Content + ? _currentReorderableListRaycasted.Content.childCount - 1 + : _currentReorderableListRaycasted.Content.childCount) >= _currentReorderableListRaycasted.maxItems && !_currentReorderableListRaycasted.IsDisplacable) + || _currentReorderableListRaycasted.maxItems <= 0) { RefreshSizes(); _fakeElement.transform.SetParent(_reorderableList.DraggableArea, false); - + // revert the displaced element when not hovering over its list + if (_displacedObject != null) + { + revertDisplacedElement(); + } } - //Else find the best position on the list and put fake element on the right index + //Else find the best position on the list and put fake element on the right index else { - if (_fakeElement.parent != _currentReorderableListRaycasted) + if (_currentReorderableListRaycasted.Content.childCount < _currentReorderableListRaycasted.maxItems && _fakeElement.parent != _currentReorderableListRaycasted.Content) + { _fakeElement.SetParent(_currentReorderableListRaycasted.Content, false); + } float minDistance = float.PositiveInfinity; int targetIndex = 0; @@ -176,7 +204,24 @@ namespace UnityEngine.UI.Extensions targetIndex = j; } } - + if ((_currentReorderableListRaycasted != _oldReorderableListRaycasted || targetIndex != _displacedFromIndex) + && _currentReorderableListRaycasted.Content.childCount == _currentReorderableListRaycasted.maxItems) + { + Transform toDisplace = _currentReorderableListRaycasted.Content.GetChild(targetIndex); + if (_displacedObject != null) + { + revertDisplacedElement(); + if (_currentReorderableListRaycasted.Content.childCount > _currentReorderableListRaycasted.maxItems) + { + displaceElement(targetIndex, toDisplace); + } + } + else if (_fakeElement.parent != _currentReorderableListRaycasted.Content) + { + _fakeElement.SetParent(_currentReorderableListRaycasted.Content, false); + displaceElement(targetIndex, toDisplace); + } + } RefreshSizes(); _fakeElement.SetSiblingIndex(targetIndex); _fakeElement.gameObject.SetActive(true); @@ -186,6 +231,117 @@ namespace UnityEngine.UI.Extensions #endregion + + #region Displacement + + private void displaceElement(int targetIndex, Transform displaced) + { + _displacedFromIndex = targetIndex; + _displacedObjectOriginList = _currentReorderableListRaycasted; + _displacedObject = displaced.GetComponent(); + _displacedObjectLE = _displacedObject.GetComponent(); + _displacedObjectOriginalSize = _displacedObject.rect.size; + + var args = new ReorderableList.ReorderableListEventStruct + { + DroppedObject = _displacedObject.gameObject, + FromList = _currentReorderableListRaycasted, + FromIndex = targetIndex, + }; + + + int c = _fakeElement.parent == _reorderableList.Content + ? _reorderableList.Content.childCount - 1 + : _reorderableList.Content.childCount; + + if (_reorderableList.IsDropable && c < _reorderableList.maxItems && _displacedObject.GetComponent().IsTransferable) + { + _displacedObjectLE.preferredWidth = _draggingObjectOriginalSize.x; + _displacedObjectLE.preferredHeight = _draggingObjectOriginalSize.y; + _displacedObject.SetParent(_reorderableList.Content, false); + _displacedObject.rotation = _reorderableList.transform.rotation; + _displacedObject.SetSiblingIndex(_fromIndex); + // Force refreshing both lists because otherwise we get inappropriate FromList in ReorderableListEventStruct + _reorderableList.Refresh(); + _currentReorderableListRaycasted.Refresh(); + + args.ToList = _reorderableList; + args.ToIndex = _fromIndex; + _reorderableList.OnElementDisplacedTo.Invoke(args); + _reorderableList.OnElementAdded.Invoke(args); + } + else if (_displacedObject.GetComponent().isDroppableInSpace) + { + _displacedObject.SetParent(_currentReorderableListRaycasted.DraggableArea, true); + _currentReorderableListRaycasted.Refresh(); + _displacedObject.position += new Vector3(_draggingObjectOriginalSize.x / 2, _draggingObjectOriginalSize.y / 2, 0); + } + else + { + _displacedObject.SetParent(null, true); + _displacedObjectOriginList.Refresh(); + _displacedObject.gameObject.SetActive(false); + } + _displacedObjectOriginList.OnElementDisplacedFrom.Invoke(args); + _reorderableList.OnElementRemoved.Invoke(args); + } + + private void revertDisplacedElement() + { + var args = new ReorderableList.ReorderableListEventStruct + { + DroppedObject = _displacedObject.gameObject, + FromList = _displacedObjectOriginList, + FromIndex = _displacedFromIndex, + }; + if (_displacedObject.parent != null) + { + args.ToList = _reorderableList; + args.ToIndex = _fromIndex; + } + + _displacedObjectLE.preferredWidth = _displacedObjectOriginalSize.x; + _displacedObjectLE.preferredHeight = _displacedObjectOriginalSize.y; + _displacedObject.SetParent(_displacedObjectOriginList.Content, false); + _displacedObject.rotation = _displacedObjectOriginList.transform.rotation; + _displacedObject.SetSiblingIndex(_displacedFromIndex); + _displacedObject.gameObject.SetActive(true); + + // Force refreshing both lists because otherwise we get inappropriate FromList in ReorderableListEventStruct + _reorderableList.Refresh(); + _displacedObjectOriginList.Refresh(); + + if (args.ToList != null) + { + _reorderableList.OnElementDisplacedToReturned.Invoke(args); + _reorderableList.OnElementRemoved.Invoke(args); + } + _displacedObjectOriginList.OnElementDisplacedFromReturned.Invoke(args); + _displacedObjectOriginList.OnElementAdded.Invoke(args); + + _displacedFromIndex = -1; + _displacedObjectOriginList = null; + _displacedObject = null; + _displacedObjectLE = null; + + } + + + public void finishDisplacingElement() + { + if (_displacedObject.parent == null) + { + Destroy(_displacedObject.gameObject); + } + _displacedFromIndex = -1; + _displacedObjectOriginList = null; + _displacedObject = null; + _displacedObjectLE = null; + } + + #endregion + + #region IEndDragHandler Members public void OnEndDrag(PointerEventData eventData) @@ -194,10 +350,9 @@ namespace UnityEngine.UI.Extensions if (_draggingObject != null) { - //If we have a, ReorderableList that is dropable + //If we have a ReorderableList that is dropable //Put the dragged object into the content and at the right index - if (_currentReorderableListRaycasted != null && _currentReorderableListRaycasted.IsDropable - && (IsTransferable || _currentReorderableListRaycasted == _reorderableList )) + if (_currentReorderableListRaycasted != null && _fakeElement.parent == _currentReorderableListRaycasted.Content) { var args = new ReorderableList.ReorderableListEventStruct { @@ -223,14 +378,21 @@ namespace UnityEngine.UI.Extensions _draggingObject.SetParent(_currentReorderableListRaycasted.Content, false); _draggingObject.rotation = _currentReorderableListRaycasted.transform.rotation; _draggingObject.SetSiblingIndex(_fakeElement.GetSiblingIndex()); - - _reorderableList.OnElementAdded.Invoke(args); - // Force refreshing both lists because otherwise we get inappropriate FromList in ReorderableListEventStruct _reorderableList.Refresh(); _currentReorderableListRaycasted.Refresh(); - if(!isValid) throw new Exception("It's too late to cancel the Transfer! Do so in OnElementDropped!"); + _reorderableList.OnElementAdded.Invoke(args); + + + if (_displacedObject != null) + { + finishDisplacingElement(); + } + + if (!isValid) + throw new Exception("It's too late to cancel the Transfer! Do so in OnElementDropped!"); + } //We don't have an ReorderableList @@ -239,14 +401,14 @@ namespace UnityEngine.UI.Extensions if (this.isDroppableInSpace) { _reorderableList.OnElementDropped.Invoke(new ReorderableList.ReorderableListEventStruct - { - DroppedObject = _draggingObject.gameObject, - IsAClone = _reorderableList.CloneDraggedObject, - SourceObject = - _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject, - FromList = _reorderableList, - FromIndex = _fromIndex - }); + { + DroppedObject = _draggingObject.gameObject, + IsAClone = _reorderableList.CloneDraggedObject, + SourceObject = + _reorderableList.CloneDraggedObject ? gameObject : _draggingObject.gameObject, + FromList = _reorderableList, + FromIndex = _fromIndex + }); } else { @@ -254,14 +416,19 @@ namespace UnityEngine.UI.Extensions } } } - + //Delete fake element if (_fakeElement != null) + { Destroy(_fakeElement.gameObject); + _fakeElement = null; + } + _canvasGroup.blocksRaycasts = true; } #endregion + void CancelDrag() { _isDragging = false; @@ -290,16 +457,26 @@ namespace UnityEngine.UI.Extensions ToIndex = _fromIndex }; + _reorderableList.Refresh(); _reorderableList.OnElementAdded.Invoke(args); - if (!isValid) throw new Exception("Transfer is already Cancelled."); + if (!isValid) + throw new Exception("Transfer is already Cancelled."); } //Delete fake element if (_fakeElement != null) + { Destroy(_fakeElement.gameObject); + _fakeElement = null; + } + if (_displacedObject != null) + { + revertDisplacedElement(); + } + _canvasGroup.blocksRaycasts = true; } private void RefreshSizes() @@ -314,7 +491,7 @@ namespace UnityEngine.UI.Extensions size = firstChild.GetComponent().rect.size; } } - + _draggingObject.sizeDelta = size; _fakeElementLE.preferredHeight = _draggingObjectLE.preferredHeight = size.y; _fakeElementLE.preferredWidth = _draggingObjectLE.preferredWidth = size.x; @@ -325,6 +502,7 @@ namespace UnityEngine.UI.Extensions { _reorderableList = reorderableList; _rect = GetComponent(); + _canvasGroup = gameObject.GetOrAddComponent(); } } }