Как сделать Drag-and-drop список резиновым в EditorWindow Unity?

Как основу gui-drag-drop использовал этот код.

Я реализовал логику Drag-and-drop списка. введите сюда описание изображения

Но у меня список 2 уровневый. введите сюда описание изображения

И сейчас раскрытый под список ограничен размером ячейки:

введите сюда описание изображения

Как сделать чтоб ячейка в Drag-and-drop списке была резиновой? И не нарушала возможность перетаскивать пункты списка мышкой.

Мой код :

DataObject.cs

using UnityEngine;
using System.Collections;
using UnityEditor;
public class DataObject : GUIDraggableObject
// This class just has the capability of being dragged in GUI - it could be any type of generic data class
{
    public string m_Name;
    public int m_Value;
    public int m_Processing_Order;
    public int m_OrderValue;

    static internal GUIStyleState styleStateHeadlineblack = new GUIStyleState()
    {
        textColor = Color.white,
        background = LofP.MakeTex(Screen.width, 100, Color.black)
    };
    static internal GUIStyle styleHeadlineblack = new GUIStyle()
    {
        normal = styleStateHeadlineblack,
        fixedHeight = 20
    };

    static internal GUIStyleState styleStateHeadlinegray = new GUIStyleState()
    {
        textColor = Color.white,
        background = LofP.MakeTex(Screen.width, 100, Color.gray)
    };
    static internal GUIStyle styleHeadlinegray = new GUIStyle()
    {
        normal = styleStateHeadlinegray,
        fixedHeight = 17
    };

    internal GUIStyle style = new GUIStyle()
    {
        padding = new RectOffset(20, 0, 0, 0)
    };

    public DataObject(string name, int value, int processing_order, Vector2 position) : base(position)
    {
        m_Name = name;
        m_Value = value;
        m_Processing_Order = processing_order;
        m_OrderValue = m_Processing_Order;
    }

    internal bool valueBool = false;

    public void OnGUI()
    {
        Rect drawRect = new Rect(m_Position.x, m_Position.y, Screen.width, 100.0f), dragRect;
        EditorGUILayout.BeginVertical();

        GUILayout.BeginArea(drawRect, GUI.skin.GetStyle("Box"));
        GUILayout.Label(m_Name, style, GUILayout.ExpandWidth(true));
        dragRect = GUILayoutUtility.GetLastRect();
        dragRect = new Rect(dragRect.x + m_Position.x, dragRect.y + m_Position.y, Screen.width, dragRect.height);

        EditorGUILayout.BeginHorizontal();
        GUILayout.Label(m_Name, styleHeadlineblack);
        m_OrderValue = EditorGUILayout.IntField("Порядок:", m_OrderValue, styleHeadlineblack);
        if (Dragging)
        {
            GUILayout.Label("Перетащите на секцию...");
        }
        else if (GUILayout.Button("Применить", styleHeadlineblack, GUILayout.Width(70)))
        {
            int max = Main.getMaxOrder();
            if (max < m_OrderValue) { m_OrderValue = max; }
            Main.CountOrder(m_OrderValue, this);
        }
        EditorGUILayout.EndHorizontal();

        valueBool = EditorGUILayout.Foldout(valueBool, "объекты");
        if (valueBool)
        {
            for (int l = 0; l < PanoramaObjInspector.PanoramaObjList.Count;)
            {
                if (PanoramaObjInspector.PanoramaObjList[l].IdLayerNumber == m_Value && PanoramaObjInspector.PanoramaObjList[l].Toggle == true)
                {
                    goto Build;
                }
                else
                {
                    goto Next;
                }
            Build:
                SetSection(PanoramaObjInspector.PanoramaObjList[l], l);
            Next:
                l++;
            }
        }
        GUILayout.EndArea();
        EditorGUILayout.EndVertical();

        Drag(dragRect);
    }

    void SetSection(PanoramaObjInspector.PanoramaObj mapObj, int index)
    {
        EditorGUILayout.BeginVertical(style);
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label(mapObj.Name + "(" + mapObj.Key + ")", styleHeadlinegray);

        m_OrderValue = EditorGUILayout.IntField("Порядок:", m_OrderValue, styleHeadlinegray);
        if (Dragging)
        {
            GUILayout.Label("Перетащите на секцию...");
        }
        else if (GUILayout.Button("Применить", styleHeadlinegray, GUILayout.Width(70)))
        {
            int max = Main.getMaxOrder();
            if (max < m_OrderValue) { m_OrderValue = max; }
            Main.CountOrder(m_OrderValue, this);
        }
        EditorGUILayout.EndHorizontal();
        if (GUILayout.Button("Выбрать"))
        {
            PanoramaObjInspector.SelectObject(index, true);
            Main.selectedTabPObj = 2;
        }
        EditorGUILayout.EndVertical();
        LofP.HorizontalLine(Color.green);
    }

}

Main.cs

public class BoxSection {

    public int m_Order;
    public Rect m_SectionLObj;
    public Color m_color;
    public BoxSection(int Order,Rect SectionLObj) {
        m_Order = Order;
        m_SectionLObj = SectionLObj;
        m_color = Color.green;
    }

    public void OnGUI ()
    {
        //EditorGUILayout.BeginVertical();
        GUI.Box(m_SectionLObj, "Порядок="+m_Order ,GUI.skin.GetStyle("HelpBox"));
        //GUI.color = m_color;
        //EditorGUILayout.EndVertical();
    }

}

Vector2 _DragAndDrop;

public void DrawOnGUIDragAndDrop () {
    DataObject dropSelected;
    bool previousState, flipRepaint;
    Color color;

    GUI.Box(HeaderSection, "Die");

    GUILayout.BeginArea (BodySection);
    EditorGUILayout.BeginVertical ();

    _DragAndDrop = EditorGUILayout.BeginScrollView (_DragAndDrop, false, true, GUILayout.Width (BodySection.width), GUILayout.Height(BodySection.height));

    dropSelected = null;
    // doRepaint = false;
    doRepaint = flipRepaint = false;
    int count = 0;
    int target_Order = -1;

    foreach (var itemBoxSection in listKeyLayer)
    {
        itemBoxSection.Value.OnGUI ();
        foreach (DataObject data in m_Data_Layer.ToList())
        {

            previousState = data.Dragging;

            color = GUI.color;

            if (!data.Dragging) {
                foreach (var item in listKeyLayer)
                {
                    if(data.m_Processing_Order == item.Key) {
                        data.m_Position = new Vector2( item.Value.m_SectionLObj.x, item.Value.m_SectionLObj.y );
                    }
                }
            }

            if (previousState)
            {
                foreach (var item in listKeyLayer)
                {
                    if(item.Value.m_SectionLObj.Contains (Event.current.mousePosition)) {
                        GUI.color = Color.red;
                    } else {
                        GUI.color = color; 
                    }
                }
            }

            data.OnGUI ();

            GUI.color = color;

            if (previousState)
            {
                flipRepaint = true;
                foreach (var item in listKeyLayer)
                {
                    if (item.Value.m_SectionLObj.Contains (Event.current.mousePosition))
                    {
                        target_Order = item.Value.m_Order;
                        dropSelected = data;
                    }
                }
            }
            count++;
            LofP.HorizontalLine( Color.green );
        }
    }
    EditorGUILayout.EndScrollView();
    EditorGUILayout.EndVertical ();
    GUILayout.EndArea ();

    if (dropSelected != null && EventType.MouseUp == Event.current.type)
    {
        CountOrder (target_Order,dropSelected);
        dropSelected = null;
    }

    if (flipRepaint)
    // If some object just stopped being dragged, we should repaing for the state change
    {
        Repaint ();
    }
}
static public int getMaxOrder() {
    int max =0;
    for (int j = 0;j<m_Data_Layer.Count;j++) {
        if(m_Data_Layer[j].m_Processing_Order>max) { max=m_Data_Layer[j].m_Processing_Order; }
    }
    return max; 
}
static public void CountOrder(int targetOrder, DataObject selected) {
    if (targetOrder < selected.m_Processing_Order) {
        if(targetOrder+1==selected.m_Processing_Order) {
            for (int j = 0;j<m_Data_Layer.Count;j++) {
                if(m_Data_Layer[j].m_Processing_Order == targetOrder) {
                    m_Data_Layer[j].m_Processing_Order = targetOrder+1;
                    m_Data_Layer[j].m_OrderValue = m_Data_Layer[j].m_Processing_Order;
                } else if(m_Data_Layer[j].m_Processing_Order == targetOrder+1) {
                    m_Data_Layer[j].m_Processing_Order = targetOrder;
                    m_Data_Layer[j].m_OrderValue = m_Data_Layer[j].m_Processing_Order;
                }
            }
        } else {
            m_Data_Layer.Remove (selected);
            for (int i = selected.m_Processing_Order;i>=targetOrder;i--) {
                for (int j = 0;j<m_Data_Layer.Count;j++) {
                    if(m_Data_Layer[j].m_Processing_Order == i) {
                        m_Data_Layer[i].m_Processing_Order = m_Data_Layer[j].m_Processing_Order+1;
                        m_Data_Layer[j].m_OrderValue = m_Data_Layer[j].m_Processing_Order;
                    }
                }
            }
            selected.m_Processing_Order = targetOrder;
            selected.m_OrderValue = selected.m_Processing_Order;
            m_Data_Layer.Add (selected);
        }
    } else if (targetOrder > selected.m_Processing_Order) {
        if(targetOrder-1==selected.m_Processing_Order) {
            for (int j = 0;j<m_Data_Layer.Count;j++) {
                if(m_Data_Layer[j].m_Processing_Order == targetOrder-1) {
                    m_Data_Layer[j].m_Processing_Order = targetOrder;
                    m_Data_Layer[j].m_OrderValue = m_Data_Layer[j].m_Processing_Order;
                } else if(m_Data_Layer[j].m_Processing_Order == targetOrder) {
                    m_Data_Layer[j].m_Processing_Order = targetOrder-1;
                    m_Data_Layer[j].m_OrderValue = m_Data_Layer[j].m_Processing_Order;
                }
            }
        } else {
            m_Data_Layer.Remove (selected);
            for (int i = selected.m_Processing_Order; i<=targetOrder; i++) {
                for (int j = 0;j<m_Data_Layer.Count;j++) {
                    if(m_Data_Layer[j].m_Processing_Order == i) {
                        m_Data_Layer[j].m_Processing_Order = m_Data_Layer[j].m_Processing_Order-1;
                        m_Data_Layer[j].m_OrderValue = m_Data_Layer[j].m_Processing_Order;
                    }
                }
            }
            selected.m_Processing_Order = targetOrder;
            selected.m_OrderValue = selected.m_Processing_Order;
            m_Data_Layer.Add (selected);
        }
    }
}

GUIDraggableObject.cs

using UnityEngine;
using System.Collections;

public class GUIDraggableObject
{
    public Vector2 m_Position;
    private Vector2 m_DragStart;
    private bool m_Dragging;

    public GUIDraggableObject(Vector2 position)
    {
        m_Position = position;
    }

    public bool Dragging
    {
        get
        {
            return m_Dragging;
        }
    }

    public Vector2 Position
    {
        get
        {
            return m_Position;
        }

        set
        {
            m_Position = value;
        }
    }

    public void Drag(Rect draggingRect)
    {
        if (Event.current.type == EventType.MouseUp)
        {
            m_Dragging = false;
        }
        else if (Event.current.type == EventType.MouseDown && draggingRect.Contains(Event.current.mousePosition))
        {
            m_Dragging = true;
            m_DragStart = Event.current.mousePosition - m_Position;
            Event.current.Use();
        }

        if (m_Dragging)
        {
            m_Position = Event.current.mousePosition - m_DragStart;
        }
    }
}

Ответы (0 шт):