Как сделать Drag-and-drop список резиновым в EditorWindow Unity?
Как основу gui-drag-drop использовал этот код.
Я реализовал логику Drag-and-drop списка.

И сейчас раскрытый под список ограничен размером ячейки:
Как сделать чтоб ячейка в 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;
}
}
}

