This commit is contained in:
monitor1394
2022-03-18 08:23:17 +08:00
parent 407b3625d7
commit 4e24ba7922
16 changed files with 166 additions and 114 deletions

View File

@@ -19,12 +19,14 @@ namespace XCharts.Editor
internal List<HeaderMenuInfo> menus = new List<HeaderMenuInfo>();
protected Dictionary<string, Type> m_CoordOptionsDic;
protected List<string> m_CoordOptionsNames;
private string m_DisplayName;
internal void Init(BaseChart chart, Serie target, SerializedProperty property, UnityEditor.Editor inspector)
{
this.chart = chart;
this.serie = target;
this.baseProperty = property;
m_DisplayName = string.Format("serie {0}: {1}", serie.index, serie.GetType().Name);
//m_Inspector = inspector;
showProperty = baseProperty.FindPropertyRelative("m_Show");
if (showProperty == null)
@@ -83,8 +85,9 @@ namespace XCharts.Editor
public virtual string GetDisplayTitle()
{
var title = string.Format("serie {0}: {1}", serie.index, serie.GetType().Name);
return ObjectNames.NicifyVariableName(title);
// var title = string.Format("serie {0}: {1}", serie.index, serie.GetType().Name);
// return ObjectNames.NicifyVariableName(title);
return m_DisplayName;
}
internal SerializedProperty FindProperty(string path)

View File

@@ -98,7 +98,7 @@ namespace XCharts.Editor
title,
editor.baseProperty,
editor.showProperty,
editor.menus.ToArray());
editor.menus);
if (displayContent)
{
editor.OnInternalInspectorGUI();

View File

@@ -540,7 +540,54 @@ namespace XCharts.Editor
Action<Rect> drawCallback, params HeaderMenuInfo[] menus)
{
var rect = GUILayoutUtility.GetRect(1f, HEADER_HEIGHT);
var labelRect = DrawHeaderInternal(rect, title, state, drawBackground, activeField);
DrawMenu(rect, menus);
if (drawCallback != null)
{
drawCallback(rect);
}
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,
Action<Rect> drawCallback, List<HeaderMenuInfo> menus)
{
var rect = GUILayoutUtility.GetRect(1f, HEADER_HEIGHT);
var labelRect = DrawHeaderInternal(rect, title, state, drawBackground, activeField);
DrawMenu(rect, menus);
if (drawCallback != null)
{
drawCallback(rect);
}
var e = Event.current;
if (e.type == EventType.MouseDown)
{
if (labelRect.Contains(e.mousePosition))
{
if (e.button == 0)
{
state = !state;
e.Use();
}
}
}
return state;
}
private static Rect DrawHeaderInternal(Rect rect, string title, bool state, bool drawBackground, SerializedProperty activeField)
{
var splitRect = rect;
splitRect.x = EditorGUI.indentLevel * INDENT_WIDTH + 4;
splitRect.xMax = rect.xMax;
@@ -576,24 +623,7 @@ namespace XCharts.Editor
toggleRect.height = 13f;
activeField.boolValue = GUI.Toggle(toggleRect, activeField.boolValue, GUIContent.none);
}
DrawMenu(rect, menus);
if (drawCallback != null)
{
drawCallback(rect);
}
var e = Event.current;
if (e.type == EventType.MouseDown)
{
if (labelRect.Contains(e.mousePosition))
{
if (e.button == 0)
{
state = !state;
e.Use();
}
}
}
return state;
return labelRect;
}
internal static bool DrawHeader(string title, SerializedProperty group, SerializedProperty activeField,
@@ -612,6 +642,13 @@ namespace XCharts.Editor
return group.isExpanded;
}
internal static bool DrawHeader(string title, SerializedProperty group, SerializedProperty activeField,
List<HeaderMenuInfo> menus)
{
group.isExpanded = DrawHeader(title, group.isExpanded, false, activeField, null, menus);
return group.isExpanded;
}
internal static void DrawMenu(Rect parentRect, params HeaderMenuInfo[] menus)
{
if (menus == null || menus.Length <= 0) return;
@@ -638,6 +675,32 @@ namespace XCharts.Editor
}
}
internal static void DrawMenu(Rect parentRect, List<HeaderMenuInfo> menus)
{
if (menus == null || menus.Count <= 0) return;
var menuIcon = EditorCustomStyles.paneOptionsIcon;
var menuRect = new Rect(parentRect.xMax - menuIcon.width, parentRect.y + 2f,
menuIcon.width, menuIcon.height);
GUI.DrawTexture(menuRect, menuIcon);
var e = Event.current;
if (e.type == EventType.MouseDown)
{
if (menuRect.Contains(e.mousePosition))
{
ShowHeaderContextMenu(new Vector2(menuRect.x, menuRect.yMax), menus);
e.Use();
}
else if (parentRect.Contains(e.mousePosition))
{
if (e.button != 0)
{
ShowHeaderContextMenu(e.mousePosition, menus);
e.Use();
}
}
}
}
static void ShowHeaderContextMenu(Vector2 position, params HeaderMenuInfo[] menus)
{
if (menus == null || menus.Length <= 0) return;
@@ -651,5 +714,18 @@ namespace XCharts.Editor
}
menu.DropDown(new Rect(position, Vector2.zero));
}
static void ShowHeaderContextMenu(Vector2 position, List<HeaderMenuInfo> menus)
{
if (menus == null || menus.Count <= 0) return;
var menu = new GenericMenu();
foreach (var info in menus)
{
if (info.enable)
menu.AddItem(GetContent(info.name), false, () => info.action());
else
menu.AddDisabledItem(GetContent(info.name));
}
menu.DropDown(new Rect(position, Vector2.zero));
}
}
}

View File

@@ -553,8 +553,7 @@ namespace XCharts.Runtime
{
while (m_Data.Count >= maxCache)
{
context.isNeedUpdateFilterData = true;
m_Data.RemoveAt(m_InsertDataToHead ? m_Data.Count - 1 : 0);
RemoveData(m_InsertDataToHead ? m_Data.Count - 1 : 0);
}
}
@@ -566,6 +565,12 @@ namespace XCharts.Runtime
SetAllDirty();
}
public void RemoveData(int dataIndex)
{
context.isNeedUpdateFilterData = true;
m_Data.RemoveAt(dataIndex);
}
/// <summary>
/// 更新类目数据
/// </summary>

View File

@@ -34,7 +34,7 @@ namespace XCharts
return;
if (!grid.context.isPointerEnter)
{
axis.context.pointerValue = double.PositiveInfinity;
axis.context.pointerValue = 0;
}
else
{
@@ -44,11 +44,11 @@ namespace XCharts
var dataZoom = chart.GetDataZoomOfAxis(axis);
var dataCount = chart.series.Count > 0 ? chart.series[0].GetDataList(dataZoom).Count : 0;
var local = chart.pointerPos;
for (int j = 0; j < axis.GetDataCount(dataZoom); j++)
if (axis is YAxis)
{
if (axis is YAxis)
float splitWid = AxisHelper.GetDataWidth(axis, grid.context.height, dataCount, dataZoom);
for (int j = 0; j < axis.GetDataCount(dataZoom); j++)
{
float splitWid = AxisHelper.GetDataWidth(axis, grid.context.height, dataCount, dataZoom);
float pY = grid.context.y + j * splitWid;
if ((axis.boundaryGap && (local.y > pY && local.y <= pY + splitWid))
|| (!axis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
@@ -63,9 +63,12 @@ namespace XCharts
break;
}
}
else
}
else
{
float splitWid = AxisHelper.GetDataWidth(axis, grid.context.width, dataCount, dataZoom);
for (int j = 0; j < axis.GetDataCount(dataZoom); j++)
{
float splitWid = AxisHelper.GetDataWidth(axis, grid.context.width, dataCount, dataZoom);
float pX = grid.context.x + j * splitWid;
if ((axis.boundaryGap && (local.x > pX && local.x <= pX + splitWid))
|| (!axis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
@@ -87,7 +90,6 @@ namespace XCharts
if (axis is YAxis)
{
var yRate = axis.context.minMaxRange / grid.context.height;
var yValue = yRate * (chart.pointerPos.y - grid.context.y - axis.context.offset);
if (axis.context.minValue > 0)
yValue += axis.context.minValue;
@@ -104,7 +106,6 @@ namespace XCharts
else
{
var xRate = axis.context.minMaxRange / grid.context.width;
var xValue = xRate * (chart.pointerPos.x - grid.context.x - axis.context.offset);
if (axis.context.minValue > 0)
xValue += axis.context.minValue;

View File

@@ -74,7 +74,6 @@ namespace XCharts.Runtime
return Vector3.zero;
var yAxis = chart.GetChartComponent<YAxis>(component.index);
return GetLabelPosition(i, Orient.Horizonal, component, yAxis,
chart.theme.axis,
scaleWid,

View File

@@ -431,6 +431,7 @@ namespace XCharts.Runtime
if (m_PointerContainer is GridCoord)
{
var grid = m_PointerContainer as GridCoord;
if (!grid.context.isPointerEnter) return;
if (IsYCategoryOfGrid(grid.index))
DrawYAxisIndicator(vh, tooltip, grid);
else

View File

@@ -6,12 +6,12 @@ namespace XCharts.Runtime
{
public class ChartLabel : Image
{
[SerializeField] private ChartText m_LabelText;
private bool m_AutoHideIconWhenLabelEmpty = false;
private bool m_LabelAutoSize = true;
private float m_LabelPaddingLeftRight = 3f;
private float m_LabelPaddingTopBottom = 3f;
private ChartText m_LabelText;
private RectTransform m_LabelRect;
private RectTransform m_LabelBackgroundRect;
private RectTransform m_IconRect;

View File

@@ -7,6 +7,7 @@ using TMPro;
namespace XCharts.Runtime
{
[System.Serializable]
public class ChartText
{
private float m_ExtraWidth;

View File

@@ -1,33 +0,0 @@
namespace XCharts.Runtime
{
internal static class XAxisPool
{
private static readonly ObjectPool<XAxis> s_ListPool = new ObjectPool<XAxis>(null, null);
public static XAxis Get()
{
return s_ListPool.Get();
}
public static void Release(XAxis toRelease)
{
s_ListPool.Release(toRelease);
}
}
internal static class YAxisPool
{
private static readonly ObjectPool<YAxis> s_ListPool = new ObjectPool<YAxis>(null, null);
public static YAxis Get()
{
return s_ListPool.Get();
}
public static void Release(YAxis toRelease)
{
s_ListPool.Release(toRelease);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 3a709ca44e9a445bd86bde1bbfae80de
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -7,6 +7,7 @@ namespace XCharts.Runtime
{
internal class ObjectPool<T> where T : new()
{
private readonly bool m_NewIfEmpty = true;
private readonly Stack<T> m_Stack = new Stack<T>();
private readonly UnityAction<T> m_ActionOnGet;
private readonly UnityAction<T> m_ActionOnRelease;
@@ -15,8 +16,9 @@ namespace XCharts.Runtime
public int countActive { get { return countAll - countInactive; } }
public int countInactive { get { return m_Stack.Count; } }
public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease)
public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease, bool newIfEmpty = true)
{
m_NewIfEmpty = newIfEmpty;
m_ActionOnGet = actionOnGet;
m_ActionOnRelease = actionOnRelease;
}
@@ -26,6 +28,7 @@ namespace XCharts.Runtime
T element;
if (m_Stack.Count == 0)
{
if (!m_NewIfEmpty) return default(T);
element = new T();
countAll++;
}

View File

@@ -1,7 +1,6 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace XCharts.Runtime
{
@@ -37,15 +36,6 @@ namespace XCharts.Runtime
return element;
}
private static GameObject CreateSerieLabel(string name, Transform parent, LabelStyle label, Color color,
float iconWidth, float iconHeight, ThemeStyle theme)
{
var element = ChartHelper.AddSerieLabel(name, parent, label.backgroundWidth, label.backgroundHeight,
color, label.textStyle, theme);
ChartHelper.AddIcon("Icon", element.transform, iconWidth, iconHeight);
return element;
}
public static void Release(GameObject element)
{
if (element == null) return;
@@ -72,5 +62,14 @@ namespace XCharts.Runtime
m_Stack.Clear();
m_ReleaseDic.Clear();
}
private static GameObject CreateSerieLabel(string name, Transform parent, LabelStyle label, Color color,
float iconWidth, float iconHeight, ThemeStyle theme)
{
var element = ChartHelper.AddSerieLabel(name, parent, label.backgroundWidth, label.backgroundHeight,
color, label.textStyle, theme);
ChartHelper.AddIcon("Icon", element.transform, iconWidth, iconHeight);
return element;
}
}
}

View File

@@ -233,11 +233,12 @@ namespace XCharts.Runtime
}
public static ChartText AddTextObject(string name, Transform parent, Vector2 anchorMin, Vector2 anchorMax,
Vector2 pivot, Vector2 sizeDelta, TextStyle textStyle, ComponentTheme theme)
Vector2 pivot, Vector2 sizeDelta, TextStyle textStyle, ComponentTheme theme, ChartText chartText = null)
{
GameObject txtObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta);
txtObj.transform.localEulerAngles = new Vector3(0, 0, textStyle.rotate);
var chartText = new ChartText();
if(chartText == null)
chartText = new ChartText();
#if dUI_TextMeshPro
RemoveComponent<Text>(txtObj);
chartText.tmpText = GetOrAddComponent<TextMeshProUGUI>(txtObj);
@@ -377,9 +378,11 @@ namespace XCharts.Runtime
var sizeDelta = new Vector2(width, height);
GameObject iconObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta);
var img = GetOrAddComponent<Image>(iconObj);
img.raycastTarget = false;
img.type = type;
if (sprite != null)
if (img.raycastTarget != false)
img.raycastTarget = false;
if (img.type != type)
img.type = type;
if (sprite != null && img.sprite != sprite)
{
img.sprite = sprite;
if (width == 0 || height == 0)
@@ -398,15 +401,14 @@ namespace XCharts.Runtime
var iconStyle = axis.iconStyle;
var labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta);
var label = GetOrAddComponent<ChartLabel>(labelObj);
var labelShow = axis.axisLabel.show && (axis.axisLabel.interval == 0 || index % (axis.axisLabel.interval + 1) == 0);
if (labelShow)
{
if (!axis.axisLabel.showStartLabel && index == 0) labelShow = false;
else if (!axis.axisLabel.showEndLabel && index == total - 1) labelShow = false;
}
label.label = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme);
label.icon = ChartHelper.AddIcon("Icon", label.gameObject.transform, iconStyle.width, iconStyle.height);
label.label = AddTextObject("Text", label.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme, label.label);
label.icon = ChartHelper.AddIcon("Icon", label.transform, iconStyle.width, iconStyle.height);
label.SetAutoSize(false);
label.UpdateIcon(iconStyle, axis.GetIcon(index));
label.label.SetActive(labelShow);
@@ -421,7 +423,7 @@ namespace XCharts.Runtime
{
var labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta);
var label = GetOrAddComponent<ChartLabel>(labelObj);
label.label = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme);
label.label = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme, label.label);
label.icon = ChartHelper.AddIcon("Icon", label.gameObject.transform, 0, 0);
label.SetAutoSize(true);
label.label.SetActive(true);
@@ -468,7 +470,7 @@ namespace XCharts.Runtime
var label = GetOrAddComponent<ChartLabel>(labelGameObject);
label.labelBackground = ChartHelper.AddIcon("Background", label.gameObject.transform, 50, 20);
label.labelBackground.color = Color.black;
label.label = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme.tooltip);
label.label = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme.tooltip, label.label);
label.SetAutoSize(true);
label.SetText("");
label.color = textStyle.color;

View File

@@ -14,20 +14,19 @@ namespace XCharts.Runtime
{
List<List<SerieData>> m_StackSerieData = new List<List<SerieData>>();
private GridCoord m_SerieGrid;
private float m_LastLineWidth = 0f;
private void UpdateSerieGridContext()
{
if (m_SerieGrid == null)
return;
var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || m_LegendEnter;
var lineWidth = 0f;
var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || m_LegendEnter || m_LastLineWidth != lineWidth;
if (!needCheck)
{
if (m_LastCheckContextFlag != needCheck)
{
var needAnimation1 = false;
lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
m_LastCheckContextFlag = needCheck;
serie.context.pointerItemDataIndex = -1;
serie.context.pointerEnter = false;
@@ -49,11 +48,10 @@ namespace XCharts.Runtime
}
return;
}
m_LastLineWidth = lineWidth;
m_LastCheckContextFlag = needCheck;
var themeSymbolSize = chart.theme.serie.lineSymbolSize;
var themeSymbolSelectedSize = chart.theme.serie.lineSymbolSelectedSize;
lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth);
var needInteract = false;
if (m_LegendEnter)
{

View File

@@ -998,11 +998,22 @@ namespace XCharts.Runtime
get
{
double total = 0;
var duration = animation.GetUpdateAnimationDuration();
foreach (var sdata in data)
if (IsPerformanceMode())
{
if (sdata.show && !IsIgnoreValue(sdata.data[1]))
total += sdata.GetCurrData(1, duration);
foreach (var sdata in data)
{
if (sdata.show && !IsIgnoreValue(sdata.data[1]))
total += sdata.data[1];
}
}
else
{
var duration = animation.GetUpdateAnimationDuration();
foreach (var sdata in data)
{
if (sdata.show && !IsIgnoreValue(sdata.data[1]))
total += sdata.GetCurrData(1, duration);
}
}
return total;
}
@@ -1590,14 +1601,11 @@ namespace XCharts.Runtime
}
/// <summary>
/// 是否为性能模式。只有折线图和柱状图才有性能模式。性能模式下不绘制Symbol不刷新Label不单独设置数据项配置。
/// 是否为性能模式。性能模式下不绘制Symbol不刷新Label不单独设置数据项配置。
/// </summary>
public bool IsPerformanceMode()
{
if (IsSerie<Line>() || IsSerie<Bar>())
return m_Large && m_Data.Count > m_LargeThreshold;
else
return false;
return m_Large && m_Data.Count > m_LargeThreshold;
}
public bool IsLegendName(string legendName)