public void ProcessDropInsertion(int insertionIndex)
        {
            if (Event.current.type == EventType.DragPerform)
            {
                var draggedItem = DragAndDrop.GetGenericData(DraggedItem.TypeName) as DraggedItem;

                // Are we just reordering within the same list?
                if (draggedItem.SourceListAdaptor == this)
                {
                    Move(draggedItem.Index, insertionIndex);
                }
                else
                {
                    // Nope, we are moving the item!
                    this.Insert(insertionIndex);
                    SerializedPropertyUtility.CopyPropertyValue(this[insertionIndex], draggedItem.ShoppingItem);
                    if (!Event.current.control)
                    {
                        draggedItem.SourceListAdaptor.Remove(draggedItem.Index);
                        draggedItem.SourceListAdaptor.arrayProperty.serializedObject.ApplyModifiedProperties();
                    }
                    // Ensure that the item remains selected at its new location!
                    s_SelectedList = this;
                }
            }
        }
 public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
 {
     stateNameProp     = property.FindPropertyRelative("stateName");
     catchItemsProp    = property.FindPropertyRelative("catchItems");
     itemListProp      = property.FindPropertyRelative("itemList");
     subStateNamesProp = property.FindPropertyRelative("subStateNames");
     dragAdapt         = new DragAdapt(itemListProp, itemListProp.type);
     return(EditorGUIUtility.singleLineHeight + ReorderableListGUI.CalculateListFieldHeight(itemListProp));
 }
        public override void DrawItem(Rect position, int index)
        {
            SerializedProperty shoppingItem = this[index];

            int controlID = GUIUtility.GetControlID(FocusType.Passive);

            switch (Event.current.GetTypeForControl(controlID))
            {
            case EventType.MouseDown:
                Rect totalItemPosition = ReorderableListGUI.CurrentItemTotalPosition;
                var  draggableRect     = new Rect(totalItemPosition.x, totalItemPosition.y, totalItemPosition.width * 0.1f, EditorGUIUtility.singleLineHeight);
                if (draggableRect.Contains(Event.current.mousePosition))
                {
                    // Select this list item.
                    s_SelectedList = this;
                    s_SelectedItem = shoppingItem;
                }

                // Calculate rectangle of draggable area of the list item.
                // This example excludes the grab handle at the left.
                //draggableRect.x = position.x;
                //draggableRect.width = position.width;

                if (Event.current.button == 0 && draggableRect.Contains(Event.current.mousePosition))
                {
                    // Select this list item.
                    s_SelectedList = this;
                    s_SelectedItem = shoppingItem;

                    // Lock onto this control whilst left mouse button is held so
                    // that we can start a drag-and-drop operation when user drags.
                    GUIUtility.hotControl = controlID;
                    s_MouseDownPosition   = Event.current.mousePosition;
                    Event.current.Use();
                }
                break;

            case EventType.MouseDrag:
                if (GUIUtility.hotControl == controlID)
                {
                    GUIUtility.hotControl = 0;

                    // Begin drag-and-drop operation when the user drags the mouse
                    // pointer across the threshold. This threshold helps to avoid
                    // inadvertently starting a drag-and-drop operation.
                    if (Vector2.Distance(s_MouseDownPosition, Event.current.mousePosition) >= MouseDragThresholdInPixels)
                    {
                        // Prepare data that will represent the item.
                        var item = new DraggedItem(this, index, shoppingItem);

                        // Start drag-and-drop operation with the Unity API.
                        DragAndDrop.PrepareStartDrag();
                        // Need to reset `objectReferences` and `paths` because `PrepareStartDrag`
                        // doesn't seem to reset these (at least, in Unity 4.x).
                        DragAndDrop.objectReferences = new Object[0];
                        DragAndDrop.paths            = new string[0];

                        DragAndDrop.SetGenericData(DraggedItem.TypeName, item);
                        DragAndDrop.StartDrag(shoppingItem.type);
                    }

                    // Use this event so that the host window gets repainted with
                    // each mouse movement.
                    Event.current.Use();
                }
                break;

            case EventType.Repaint:
                //EditorStyles.label.Draw(position, shoppingItem.FindPropertyRelative("assetName").stringValue, false, false, false, false);
                break;
            }
            EditorGUI.PropertyField(position, this[index], true);
        }
 public DraggedItem(DragAdapt sourceList, int index, SerializedProperty shoppingItem)
 {
     SourceListAdaptor = sourceList;
     Index             = index;
     ShoppingItem      = shoppingItem;
 }