Files
ZHGD_Web/SelfPackages/XCharts/Runtime/Component/Mark/MarkLineHelper.cs
2025-07-13 23:16:20 +08:00

52 lines
2.8 KiB
C#

using UnityEngine;
namespace XCharts.Runtime
{
internal static class MarkLineHelper
{
public static string GetFormatterContent(Serie serie, MarkLineData data)
{
var serieLabel = data.label;
var numericFormatter = serieLabel.numericFormatter;
if (string.IsNullOrEmpty(serieLabel.formatter))
{
var content = ChartCached.NumberToStr(data.runtimeValue, numericFormatter);
return serieLabel.formatterFunction == null? content:
serieLabel.formatterFunction(data.index, data.runtimeValue, null, content);
}
else
{
var content = serieLabel.formatter;
FormatterHelper.ReplaceSerieLabelContent(ref content, numericFormatter, serie.dataCount, data.runtimeValue,
0, serie.serieName, data.name, data.name, Color.clear, null);
return serieLabel.formatterFunction == null? content:
serieLabel.formatterFunction(data.index, data.runtimeValue, null, content);
}
}
public static Vector3 GetLabelPosition(MarkLineData data)
{
if (!data.label.show) return Vector3.zero;
var dir = (data.runtimeEndPosition - data.runtimeStartPosition).normalized;
var horizontal = Mathf.Abs(Vector3.Dot(dir, Vector3.right)) == 1;
var labelWidth = data.runtimeLabel == null ? 50 : data.runtimeLabel.GetTextWidth();
var labelHeight = data.runtimeLabel == null ? 20 : data.runtimeLabel.GetTextHeight();
switch (data.label.position)
{
case LabelStyle.Position.Start:
if (data.runtimeStartPosition == Vector3.zero) return Vector3.zero;
if (horizontal) return data.runtimeStartPosition + data.label.offset + labelWidth / 2 * Vector3.left;
else return data.runtimeStartPosition + data.label.offset + labelHeight / 2 * Vector3.down;
case LabelStyle.Position.Middle:
if (data.runtimeCurrentEndPosition == Vector3.zero) return Vector3.zero;
var center = (data.runtimeStartPosition + data.runtimeCurrentEndPosition) / 2;
if (horizontal) return center + data.label.offset + labelHeight / 2 * Vector3.up;
else return center + data.label.offset + labelWidth / 2 * Vector3.right;
default:
if (data.runtimeCurrentEndPosition == Vector3.zero) return Vector3.zero;
if (horizontal) return data.runtimeCurrentEndPosition + data.label.offset + labelWidth / 2 * Vector3.right;
else return data.runtimeCurrentEndPosition + data.label.offset + labelHeight / 2 * Vector3.up;
}
}
}
}