diff --git a/Editor/Series/SerieBaseEditor.cs b/Editor/Series/SerieBaseEditor.cs index bc6f8e78..5c3c5154 100644 --- a/Editor/Series/SerieBaseEditor.cs +++ b/Editor/Series/SerieBaseEditor.cs @@ -19,12 +19,14 @@ namespace XCharts.Editor internal List menus = new List(); protected Dictionary m_CoordOptionsDic; protected List 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) diff --git a/Editor/Series/SerieListEditor.cs b/Editor/Series/SerieListEditor.cs index 7fbdf4b4..a8b67ada 100644 --- a/Editor/Series/SerieListEditor.cs +++ b/Editor/Series/SerieListEditor.cs @@ -98,7 +98,7 @@ namespace XCharts.Editor title, editor.baseProperty, editor.showProperty, - editor.menus.ToArray()); + editor.menus); if (displayContent) { editor.OnInternalInspectorGUI(); diff --git a/Editor/Utilities/ChartEditorHelper.cs b/Editor/Utilities/ChartEditorHelper.cs index bbdee5da..a33e9e6e 100644 --- a/Editor/Utilities/ChartEditorHelper.cs +++ b/Editor/Utilities/ChartEditorHelper.cs @@ -540,7 +540,54 @@ namespace XCharts.Editor Action 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 drawCallback, List 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 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 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 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)); + } } } \ No newline at end of file diff --git a/Runtime/Component/Axis/Axis.cs b/Runtime/Component/Axis/Axis.cs index 04f4f892..5820c95c 100644 --- a/Runtime/Component/Axis/Axis.cs +++ b/Runtime/Component/Axis/Axis.cs @@ -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); + } + /// /// 更新类目数据 /// diff --git a/Runtime/Component/Axis/AxisHandler.cs b/Runtime/Component/Axis/AxisHandler.cs index f80899e4..39e3b715 100644 --- a/Runtime/Component/Axis/AxisHandler.cs +++ b/Runtime/Component/Axis/AxisHandler.cs @@ -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; diff --git a/Runtime/Component/Axis/XAxis/XAxisHander.cs b/Runtime/Component/Axis/XAxis/XAxisHander.cs index c259e118..057ee7ff 100644 --- a/Runtime/Component/Axis/XAxis/XAxisHander.cs +++ b/Runtime/Component/Axis/XAxis/XAxisHander.cs @@ -74,7 +74,6 @@ namespace XCharts.Runtime return Vector3.zero; var yAxis = chart.GetChartComponent(component.index); - return GetLabelPosition(i, Orient.Horizonal, component, yAxis, chart.theme.axis, scaleWid, diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index 3b95f41f..db0cbe86 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -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 diff --git a/Runtime/Internal/Object/ChartLabel.cs b/Runtime/Internal/Object/ChartLabel.cs index e4c5b8af..600e35a3 100644 --- a/Runtime/Internal/Object/ChartLabel.cs +++ b/Runtime/Internal/Object/ChartLabel.cs @@ -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; diff --git a/Runtime/Internal/Object/ChartText.cs b/Runtime/Internal/Object/ChartText.cs index 037bce1b..25e862e4 100644 --- a/Runtime/Internal/Object/ChartText.cs +++ b/Runtime/Internal/Object/ChartText.cs @@ -7,6 +7,7 @@ using TMPro; namespace XCharts.Runtime { + [System.Serializable] public class ChartText { private float m_ExtraWidth; diff --git a/Runtime/Internal/Pools/AxisPool.cs b/Runtime/Internal/Pools/AxisPool.cs deleted file mode 100644 index c83344c2..00000000 --- a/Runtime/Internal/Pools/AxisPool.cs +++ /dev/null @@ -1,33 +0,0 @@ - -namespace XCharts.Runtime -{ - internal static class XAxisPool - { - private static readonly ObjectPool s_ListPool = new ObjectPool(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 s_ListPool = new ObjectPool(null, null); - - public static YAxis Get() - { - return s_ListPool.Get(); - } - - public static void Release(YAxis toRelease) - { - s_ListPool.Release(toRelease); - } - } -} diff --git a/Runtime/Internal/Pools/AxisPool.cs.meta b/Runtime/Internal/Pools/AxisPool.cs.meta deleted file mode 100644 index 1128203d..00000000 --- a/Runtime/Internal/Pools/AxisPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3a709ca44e9a445bd86bde1bbfae80de -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/Internal/Pools/ObjectPool.cs b/Runtime/Internal/Pools/ObjectPool.cs index 4714c1d5..4bc31dc8 100644 --- a/Runtime/Internal/Pools/ObjectPool.cs +++ b/Runtime/Internal/Pools/ObjectPool.cs @@ -7,6 +7,7 @@ namespace XCharts.Runtime { internal class ObjectPool where T : new() { + private readonly bool m_NewIfEmpty = true; private readonly Stack m_Stack = new Stack(); private readonly UnityAction m_ActionOnGet; private readonly UnityAction 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 actionOnGet, UnityAction actionOnRelease) + public ObjectPool(UnityAction actionOnGet, UnityAction 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++; } diff --git a/Runtime/Internal/Pools/SerieLabelPool.cs b/Runtime/Internal/Pools/SerieLabelPool.cs index f8ad3d39..8a2bac29 100644 --- a/Runtime/Internal/Pools/SerieLabelPool.cs +++ b/Runtime/Internal/Pools/SerieLabelPool.cs @@ -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; + } } } diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 8f1bd414..bade1c96 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -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(txtObj); chartText.tmpText = GetOrAddComponent(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(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(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(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(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; diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index 701e5366..5aa3987d 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -14,20 +14,19 @@ namespace XCharts.Runtime { List> m_StackSerieData = new List>(); 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) { diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 7418c72c..3512423b 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -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 } /// - /// 是否为性能模式。只有折线图和柱状图才有性能模式。性能模式下不绘制Symbol,不刷新Label,不单独设置数据项配置。 + /// 是否为性能模式。性能模式下不绘制Symbol,不刷新Label,不单独设置数据项配置。 /// public bool IsPerformanceMode() { - if (IsSerie() || IsSerie()) - return m_Large && m_Data.Count > m_LargeThreshold; - else - return false; + return m_Large && m_Data.Count > m_LargeThreshold; } public bool IsLegendName(string legendName)