mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-30 21:38:49 +00:00
优化Editor下编辑性能
This commit is contained in:
@@ -53,14 +53,18 @@ namespace XCharts.Editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HeaderMenuInfo headMenuInfo = new HeaderMenuInfo("Import ECharts Data", null);
|
||||||
|
|
||||||
|
private void HeadMenuInfoCallback()
|
||||||
|
{
|
||||||
|
PraseExternalDataEditor.UpdateData(chart, serie, null, false);
|
||||||
|
PraseExternalDataEditor.ShowWindow();
|
||||||
|
}
|
||||||
|
|
||||||
private void PropertyFieldData()
|
private void PropertyFieldData()
|
||||||
{
|
{
|
||||||
m_DataFoldout = ChartEditorHelper.DrawHeader("Data", m_DataFoldout, false, null, null,
|
headMenuInfo.action = HeadMenuInfoCallback;
|
||||||
new HeaderMenuInfo("Import ECharts Data", () =>
|
m_DataFoldout = ChartEditorHelper.DrawHeader("Data", m_DataFoldout, false, null, null, headMenuInfo);
|
||||||
{
|
|
||||||
PraseExternalDataEditor.UpdateData(chart, serie, null, false);
|
|
||||||
PraseExternalDataEditor.ShowWindow();
|
|
||||||
}));
|
|
||||||
if (!m_DataFoldout) return;
|
if (!m_DataFoldout) return;
|
||||||
EditorGUI.indentLevel++;
|
EditorGUI.indentLevel++;
|
||||||
var m_Datas = FindProperty("m_Data");
|
var m_Datas = FindProperty("m_Data");
|
||||||
@@ -103,14 +107,18 @@ namespace XCharts.Editor
|
|||||||
EditorGUI.indentLevel--;
|
EditorGUI.indentLevel--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HeaderMenuInfo linkHeadMenuInfo = new HeaderMenuInfo("Import ECharts Link", null);
|
||||||
|
|
||||||
|
private void LinkHeadMenuInfoCallback()
|
||||||
|
{
|
||||||
|
PraseExternalDataEditor.UpdateData(chart, serie, null, false);
|
||||||
|
PraseExternalDataEditor.ShowWindow();
|
||||||
|
}
|
||||||
|
|
||||||
protected void PropertyFieldLinks()
|
protected void PropertyFieldLinks()
|
||||||
{
|
{
|
||||||
m_LinksFoldout = ChartEditorHelper.DrawHeader("Links", m_LinksFoldout, false, null, null,
|
linkHeadMenuInfo.action = LinkHeadMenuInfoCallback;
|
||||||
new HeaderMenuInfo("Import ECharts Link", () =>
|
m_LinksFoldout = ChartEditorHelper.DrawHeader("Links", m_LinksFoldout, false, null, null, linkHeadMenuInfo);
|
||||||
{
|
|
||||||
//PraseExternalDataEditor.UpdateData(chart, serie, null, true);
|
|
||||||
//PraseExternalDataEditor.ShowWindow();
|
|
||||||
}));
|
|
||||||
if (!m_LinksFoldout) return;
|
if (!m_LinksFoldout) return;
|
||||||
EditorGUI.indentLevel++;
|
EditorGUI.indentLevel++;
|
||||||
var m_Links = FindProperty("m_Links");
|
var m_Links = FindProperty("m_Links");
|
||||||
@@ -154,6 +162,75 @@ namespace XCharts.Editor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DrawSerieDataHeader(Rect drawRect,HeaderCallbackContext context)
|
||||||
|
{
|
||||||
|
var serieData = context.serieData;
|
||||||
|
var fieldCount = context.fieldCount;
|
||||||
|
var showName = context.showName;
|
||||||
|
var index = context.index;
|
||||||
|
var dimension = context.dimension;
|
||||||
|
|
||||||
|
//drawRect.width -= 2f;
|
||||||
|
var maxX = drawRect.xMax;
|
||||||
|
var currentWidth = drawRect.width;
|
||||||
|
var lastX = drawRect.x;
|
||||||
|
var lastWid = drawRect.width;
|
||||||
|
var lastFieldWid = EditorGUIUtility.fieldWidth;
|
||||||
|
var lastLabelWid = EditorGUIUtility.labelWidth;
|
||||||
|
var sereName = serieData.FindPropertyRelative("m_Name");
|
||||||
|
var data = serieData.FindPropertyRelative("m_Data");
|
||||||
|
#if UNITY_2019_3_OR_NEWER
|
||||||
|
var gap = 2;
|
||||||
|
var namegap = 3;
|
||||||
|
#else
|
||||||
|
var gap = 0;
|
||||||
|
var namegap = 0;
|
||||||
|
#endif
|
||||||
|
if (fieldCount <= 1)
|
||||||
|
{
|
||||||
|
while (2 > data.arraySize)
|
||||||
|
{
|
||||||
|
var value = data.arraySize == 0 ? index : 0;
|
||||||
|
data.arraySize++;
|
||||||
|
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
||||||
|
}
|
||||||
|
SerializedProperty element = data.GetArrayElementAtIndex(1);
|
||||||
|
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
||||||
|
drawRect.x = startX;
|
||||||
|
drawRect.xMax = maxX;
|
||||||
|
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
||||||
|
var dataWidTotal = (currentWidth - (startX + 20.5f + 1));
|
||||||
|
var dataWid = dataWidTotal / fieldCount;
|
||||||
|
var xWid = dataWid - 0;
|
||||||
|
for (int i = 0; i < dimension; i++)
|
||||||
|
{
|
||||||
|
var dataCount = i < 1 ? 2 : i + 1;
|
||||||
|
while (dataCount > data.arraySize)
|
||||||
|
{
|
||||||
|
var value = data.arraySize == 0 ? index : 0;
|
||||||
|
data.arraySize++;
|
||||||
|
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
||||||
|
}
|
||||||
|
drawRect.x = startX + i * xWid;
|
||||||
|
drawRect.width = dataWid + 25;
|
||||||
|
SerializedProperty element = data.GetArrayElementAtIndex(dimension <= 1 ? 1 : i);
|
||||||
|
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
||||||
|
}
|
||||||
|
if (showName)
|
||||||
|
{
|
||||||
|
drawRect.x = startX + (fieldCount - 1) * xWid;
|
||||||
|
drawRect.width = dataWid + 40 + dimension * namegap - 2.5f;
|
||||||
|
EditorGUI.PropertyField(drawRect, sereName, GUIContent.none);
|
||||||
|
}
|
||||||
|
EditorGUIUtility.fieldWidth = lastFieldWid;
|
||||||
|
EditorGUIUtility.labelWidth = lastLabelWid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void DrawSerieData(int dimension, SerializedProperty m_Datas, int index, bool showName)
|
private void DrawSerieData(int dimension, SerializedProperty m_Datas, int index, bool showName)
|
||||||
{
|
{
|
||||||
bool flag;
|
bool flag;
|
||||||
@@ -165,70 +242,14 @@ namespace XCharts.Editor
|
|||||||
var fieldCount = dimension + (showName ? 1 : 0);
|
var fieldCount = dimension + (showName ? 1 : 0);
|
||||||
var serieData = m_Datas.GetArrayElementAtIndex(index);
|
var serieData = m_Datas.GetArrayElementAtIndex(index);
|
||||||
var dataIndex = serieData.FindPropertyRelative("m_Index").intValue;
|
var dataIndex = serieData.FindPropertyRelative("m_Index").intValue;
|
||||||
m_DataElementFoldout[index] = ChartEditorHelper.DrawHeader("SerieData " + dataIndex, flag, false, null,
|
var callbackContext = new HeaderCallbackContext(){
|
||||||
delegate (Rect drawRect)
|
serieData = serieData,
|
||||||
{
|
fieldCount = fieldCount,
|
||||||
//drawRect.width -= 2f;
|
showName = showName,
|
||||||
var maxX = drawRect.xMax;
|
index = index,
|
||||||
var currentWidth = drawRect.width;
|
dimension = dimension
|
||||||
var lastX = drawRect.x;
|
};
|
||||||
var lastWid = drawRect.width;
|
m_DataElementFoldout[index] = ChartEditorHelper.DrawSerieDataHeader("SerieData " + dataIndex, flag, false, null, callbackContext, DrawSerieDataHeader);
|
||||||
var lastFieldWid = EditorGUIUtility.fieldWidth;
|
|
||||||
var lastLabelWid = EditorGUIUtility.labelWidth;
|
|
||||||
//var serieData = m_Datas.GetArrayElementAtIndex(index);
|
|
||||||
var sereName = serieData.FindPropertyRelative("m_Name");
|
|
||||||
var data = serieData.FindPropertyRelative("m_Data");
|
|
||||||
#if UNITY_2019_3_OR_NEWER
|
|
||||||
var gap = 2;
|
|
||||||
var namegap = 3;
|
|
||||||
#else
|
|
||||||
var gap = 0;
|
|
||||||
var namegap = 0;
|
|
||||||
#endif
|
|
||||||
if (fieldCount <= 1)
|
|
||||||
{
|
|
||||||
while (2 > data.arraySize)
|
|
||||||
{
|
|
||||||
var value = data.arraySize == 0 ? index : 0;
|
|
||||||
data.arraySize++;
|
|
||||||
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
|
||||||
}
|
|
||||||
SerializedProperty element = data.GetArrayElementAtIndex(1);
|
|
||||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
|
||||||
drawRect.x = startX;
|
|
||||||
drawRect.xMax = maxX;
|
|
||||||
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
|
||||||
var dataWidTotal = (currentWidth - (startX + 20.5f + 1));
|
|
||||||
var dataWid = dataWidTotal / fieldCount;
|
|
||||||
var xWid = dataWid - 0;
|
|
||||||
for (int i = 0; i < dimension; i++)
|
|
||||||
{
|
|
||||||
var dataCount = i < 1 ? 2 : i + 1;
|
|
||||||
while (dataCount > data.arraySize)
|
|
||||||
{
|
|
||||||
var value = data.arraySize == 0 ? index : 0;
|
|
||||||
data.arraySize++;
|
|
||||||
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
|
||||||
}
|
|
||||||
drawRect.x = startX + i * xWid;
|
|
||||||
drawRect.width = dataWid + 25;
|
|
||||||
SerializedProperty element = data.GetArrayElementAtIndex(dimension <= 1 ? 1 : i);
|
|
||||||
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
|
||||||
}
|
|
||||||
if (showName)
|
|
||||||
{
|
|
||||||
drawRect.x = startX + (fieldCount - 1) * xWid;
|
|
||||||
drawRect.width = dataWid + 40 + dimension * namegap - 2.5f;
|
|
||||||
EditorGUI.PropertyField(drawRect, sereName, GUIContent.none);
|
|
||||||
}
|
|
||||||
EditorGUIUtility.fieldWidth = lastFieldWid;
|
|
||||||
EditorGUIUtility.labelWidth = lastLabelWid;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (m_DataElementFoldout[index])
|
if (m_DataElementFoldout[index])
|
||||||
{
|
{
|
||||||
if (!(serie is ISimplifiedSerie))
|
if (!(serie is ISimplifiedSerie))
|
||||||
|
|||||||
@@ -6,6 +6,15 @@ using XCharts.Runtime;
|
|||||||
|
|
||||||
namespace XCharts.Editor
|
namespace XCharts.Editor
|
||||||
{
|
{
|
||||||
|
public class HeaderCallbackContext
|
||||||
|
{
|
||||||
|
public int fieldCount = 0;
|
||||||
|
public SerializedProperty serieData;
|
||||||
|
public bool showName;
|
||||||
|
public int index;
|
||||||
|
public int dimension;
|
||||||
|
}
|
||||||
|
|
||||||
public class HeaderMenuInfo
|
public class HeaderMenuInfo
|
||||||
{
|
{
|
||||||
public string name;
|
public string name;
|
||||||
@@ -586,6 +595,31 @@ namespace XCharts.Editor
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool DrawSerieDataHeader(string title, bool state, bool drawBackground, SerializedProperty activeField,
|
||||||
|
HeaderCallbackContext context, Action<Rect, HeaderCallbackContext> drawCallback, params HeaderMenuInfo[] menus)
|
||||||
|
{
|
||||||
|
var rect = GUILayoutUtility.GetRect(1f, HEADER_HEIGHT);
|
||||||
|
var labelRect = DrawHeaderInternal(rect, title, ref state, drawBackground, activeField);
|
||||||
|
DrawMenu(rect, menus);
|
||||||
|
if (drawCallback != null)
|
||||||
|
{
|
||||||
|
drawCallback(rect, context);
|
||||||
|
}
|
||||||
|
var e = Event.current;
|
||||||
|
if (e.type == EventType.MouseDown)
|
||||||
|
{
|
||||||
|
if (labelRect.Contains(e.mousePosition))
|
||||||
|
{
|
||||||
|
if (e.button == 0)
|
||||||
|
{
|
||||||
|
state = !state;
|
||||||
|
e.Use();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
internal static bool DrawHeader(string title, bool state, bool drawBackground, SerializedProperty activeField,
|
internal static bool DrawHeader(string title, bool state, bool drawBackground, SerializedProperty activeField,
|
||||||
Action<Rect> drawCallback, List<HeaderMenuInfo> menus)
|
Action<Rect> drawCallback, List<HeaderMenuInfo> menus)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user