8 using System.Collections.Generic;
10 using UnityEngine.EventSystems;
72 [SerializeField]
private bool m_Enable;
73 [SerializeField]
private FilterMode m_FilterMode;
74 [SerializeField]
private List<int> m_XAxisIndexs =
new List<int>() { 0 };
75 [SerializeField]
private List<int> m_YAxisIndexs =
new List<int>() { };
76 [SerializeField]
private bool m_SupportInside;
77 [SerializeField]
private bool m_SupportInsideScroll =
true;
78 [SerializeField]
private bool m_SupportInsideDrag =
true;
79 [SerializeField]
private bool m_SupportSlider;
80 [SerializeField]
private bool m_SupportSelect;
81 [SerializeField]
private bool m_ShowDataShadow;
82 [SerializeField]
private bool m_ShowDetail;
83 [SerializeField]
private bool m_ZoomLock;
84 [SerializeField]
private bool m_Realtime;
85 [SerializeField]
protected Color32 m_FillerColor;
86 [SerializeField]
protected Color32 m_BorderColor;
87 [SerializeField]
protected float m_BorderWidth;
88 [SerializeField]
protected Color32 m_BackgroundColor;
89 [SerializeField]
private float m_Left;
90 [SerializeField]
private float m_Right;
91 [SerializeField]
private float m_Top;
92 [SerializeField]
private float m_Bottom;
93 [SerializeField]
private RangeMode m_RangeMode;
94 [SerializeField]
private float m_Start;
95 [SerializeField]
private float m_End;
96 [SerializeField]
private float m_StartValue;
97 [SerializeField]
private float m_EndValue;
98 [SerializeField]
private int m_MinShowNum = 1;
100 [SerializeField]
private float m_ScrollSensitivity = 1.1f;
101 [SerializeField]
private Orient m_Orient =
Orient.Horizonal;
102 [SerializeField]
private TextStyle m_TextStyle;
103 [SerializeField]
private LineStyle m_LineStyle =
new LineStyle(LineStyle.Type.Solid);
104 [SerializeField]
private AreaStyle m_AreaStyle =
new AreaStyle();
112 get {
return m_Enable; }
113 set {
if (PropertyUtil.SetStruct(ref m_Enable, value)) SetVerticesDirty(); }
121 get {
return m_FilterMode; }
122 set {
if (PropertyUtil.SetStruct(ref m_FilterMode, value)) SetVerticesDirty(); }
130 get {
return m_XAxisIndexs; }
131 set {
if (PropertyUtil.SetClass(ref m_XAxisIndexs, value)) SetVerticesDirty(); }
139 get {
return m_YAxisIndexs; }
140 set {
if (PropertyUtil.SetClass(ref m_YAxisIndexs, value)) SetVerticesDirty(); }
151 get {
return m_SupportInside; }
152 set {
if (PropertyUtil.SetStruct(ref m_SupportInside, value)) SetVerticesDirty(); }
159 get {
return m_SupportInsideScroll; }
160 set {
if (PropertyUtil.SetStruct(ref m_SupportInsideScroll, value)) SetVerticesDirty(); }
167 get {
return m_SupportInsideDrag; }
168 set {
if (PropertyUtil.SetStruct(ref m_SupportInsideDrag, value)) SetVerticesDirty(); }
176 get {
return m_SupportSlider; }
177 set {
if (PropertyUtil.SetStruct(ref m_SupportSlider, value)) SetVerticesDirty(); }
182 private bool supportSelect
184 get {
return m_SupportSelect; }
185 set {
if (PropertyUtil.SetStruct(ref m_SupportSelect, value)) SetVerticesDirty(); }
194 get {
return m_ShowDataShadow; }
195 set {
if (PropertyUtil.SetStruct(ref m_ShowDataShadow, value)) SetVerticesDirty(); }
204 get {
return m_ShowDetail; }
205 set {
if (PropertyUtil.SetStruct(ref m_ShowDetail, value)) SetVerticesDirty(); }
215 get {
return m_ZoomLock; }
216 set {
if (PropertyUtil.SetStruct(ref m_ZoomLock, value)) SetVerticesDirty(); }
230 get {
return m_BackgroundColor; }
231 set {
if (PropertyUtil.SetStruct(ref m_BackgroundColor, value)) SetVerticesDirty(); }
239 get {
return m_FillerColor; }
240 set {
if (PropertyUtil.SetColor(ref m_FillerColor, value)) SetVerticesDirty(); }
249 get {
return m_BorderColor; }
250 set {
if (PropertyUtil.SetColor(ref m_BorderColor, value)) SetComponentDirty(); }
257 get {
return m_BorderWidth; }
258 set {
if (PropertyUtil.SetStruct(ref m_BorderWidth, value)) SetComponentDirty(); }
268 get {
return m_Bottom; }
269 set {
if (PropertyUtil.SetStruct(ref m_Bottom, value)) SetVerticesDirty(); }
279 get {
return m_Top; }
280 set {
if (PropertyUtil.SetStruct(ref m_Top, value)) SetVerticesDirty(); }
290 get {
return m_Left; }
291 set {
if (PropertyUtil.SetStruct(ref m_Left, value)) SetVerticesDirty(); }
301 get {
return m_Right; }
302 set {
if (PropertyUtil.SetStruct(ref m_Right, value)) SetVerticesDirty(); }
311 get {
return m_RangeMode; }
312 set {
if (PropertyUtil.SetStruct(ref m_RangeMode, value)) SetVerticesDirty(); }
321 get {
return m_Start; }
322 set { m_Start = value;
if (m_Start < 0) m_Start = 0;
if (m_Start > 100) m_Start = 100; SetVerticesDirty(); }
331 get {
return m_End; }
332 set { m_End = value;
if (m_End < 0) m_End = 0;
if (m_End > 100) m_End = 100; SetVerticesDirty(); }
340 get {
return m_MinShowNum; }
341 set {
if (PropertyUtil.SetStruct(ref m_MinShowNum, value)) SetVerticesDirty(); }
351 get {
return m_ScrollSensitivity; }
352 set {
if (PropertyUtil.SetStruct(ref m_ScrollSensitivity, value)) SetVerticesDirty(); }
363 get {
return m_Orient; }
364 set {
if (PropertyUtil.SetStruct(ref m_Orient, value)) SetVerticesDirty(); }
372 get {
return m_TextStyle; }
373 set {
if (PropertyUtil.SetClass(ref m_TextStyle, value)) SetComponentDirty(); }
380 get {
return m_LineStyle; }
381 set {
if (PropertyUtil.SetClass(ref m_LineStyle, value)) SetComponentDirty(); }
388 get {
return m_AreaStyle; }
389 set {
if (PropertyUtil.SetClass(ref m_AreaStyle, value)) SetComponentDirty(); }
391 public int index {
get;
internal set; }
392 public float runtimeX {
get;
private set; }
393 public float runtimeY {
get;
private set; }
394 public float runtimeWidth {
get;
private set; }
395 public float runtimeHeight {
get;
private set; }
396 public bool runtimeDrag {
get;
internal set; }
397 public bool runtimeCoordinateDrag {
get;
internal set; }
398 public bool runtimeStartDrag {
get;
internal set; }
399 public bool runtimeEndDrag {
get;
internal set; }
408 public bool runtimeInvert {
get;
set; }
410 class AxisIndexValueInfo
415 private Dictionary<int, AxisIndexValueInfo> m_XAxisIndexInfos =
new Dictionary<int, AxisIndexValueInfo>();
416 private Dictionary<int, AxisIndexValueInfo> m_YAxisIndexInfos =
new Dictionary<int, AxisIndexValueInfo>();
422 private ChartText m_StartLabel {
get;
set; }
427 private ChartText m_EndLabel {
get;
set; }
429 public static DataZoom defaultDataZoom
433 return new DataZoom()
450 m_Orient =
Orient.Horizonal,
451 m_ScrollSensitivity = 10,
452 m_TextStyle =
new TextStyle(),
453 m_LineStyle =
new LineStyle(LineStyle.Type.Solid)
457 m_AreaStyle =
new AreaStyle()
475 if (pos.x < runtimeX - 1 || pos.x > runtimeX + runtimeWidth + 1 ||
476 pos.y < runtimeY - 1 || pos.y > runtimeY + runtimeHeight + 1)
493 var
start = runtimeX + runtimeWidth * m_Start / 100;
494 var
end = runtimeX + runtimeWidth * m_End / 100;
495 return ChartHelper.IsInRect(pos,
start,
end, runtimeY, runtimeY + runtimeHeight);
497 start = runtimeY + runtimeHeight * m_Start / 100;
498 end = runtimeY + runtimeHeight * m_End / 100;
499 return ChartHelper.IsInRect(pos, runtimeX, runtimeX + runtimeWidth,
start,
end);
500 default:
return false;
507 if (totalIndex <= 0)
return false;
508 var tstart = invert ? 100 -
end :
start;
509 var tend = invert ? 100 -
start :
end;
510 var range = Mathf.RoundToInt(totalIndex * (tend - tstart) / 100);
511 var min = Mathf.FloorToInt(totalIndex * tstart / 100);
512 var max = Mathf.CeilToInt(totalIndex * tend / 100);
513 if (min == 0) max = min + range;
514 if (max == totalIndex) min = max - range;
515 var flag = index >= min && index < min + range;
532 var
start = runtimeX + runtimeWidth * m_Start / 100;
533 return ChartHelper.IsInRect(pos,
start - 10,
start + 10, runtimeY, runtimeY + runtimeHeight);
535 start = runtimeY + runtimeHeight * m_Start / 100;
536 return ChartHelper.IsInRect(pos, runtimeX, runtimeX + runtimeWidth,
start - 10,
start + 10);
537 default:
return false;
553 var
end = runtimeX + runtimeWidth * m_End / 100;
554 return ChartHelper.IsInRect(pos,
end - 10,
end + 10, runtimeY, runtimeY + runtimeHeight);
556 end = runtimeY + runtimeHeight * m_End / 100;
557 return ChartHelper.IsInRect(pos, runtimeX, runtimeX + runtimeWidth,
end - 10,
end + 10);
558 default:
return false;
563 public bool IsContainsAxis(
Axis axis)
565 if (axis ==
null)
return false;
570 public bool IsContainsXAxis(
int index)
575 public bool IsContainsYAxis(
int index)
580 public Color32 GetFillerColor(Color32 themeColor)
582 if (ChartHelper.IsClearColor(
fillerColor))
return themeColor;
586 public Color32 GetBackgroundColor(Color32 themeColor)
591 public Color32 GetBorderColor(Color32 themeColor)
593 if (ChartHelper.IsClearColor(
borderColor))
return themeColor;
601 internal void SetLabelActive(
bool flag)
603 if (m_StartLabel !=
null && m_StartLabel.gameObject.activeInHierarchy != flag)
605 m_StartLabel.gameObject.SetActive(flag);
607 if (m_EndLabel !=
null && m_EndLabel.gameObject.activeInHierarchy != flag)
609 m_EndLabel.gameObject.SetActive(flag);
617 internal void SetStartLabelText(
string text)
619 if (m_StartLabel !=
null) m_StartLabel.SetText(text);
626 internal void SetEndLabelText(
string text)
628 if (m_EndLabel !=
null) m_EndLabel.SetText(text);
631 internal void SetStartLabel(ChartText startLabel)
633 m_StartLabel = startLabel;
636 internal void SetEndLabel(ChartText endLabel)
638 m_EndLabel = endLabel;
641 internal void UpdateStartLabelPosition(Vector3 pos)
643 m_StartLabel.SetLocalPosition(pos);
646 internal void UpdateEndLabelPosition(Vector3 pos)
648 m_EndLabel.SetLocalPosition(pos);
651 internal void UpdateRuntimeData(
float chartX,
float chartY,
float chartWidth,
float chartHeight)
655 var runtimeTop =
top <= 1 ?
top * chartHeight :
top;
657 runtimeX = chartX + runtimeLeft;
658 runtimeY = chartY + runtimeBottom;
659 runtimeWidth = chartWidth - runtimeLeft - runtimeRight;
660 runtimeHeight = chartHeight - runtimeTop - runtimeBottom;
663 internal void SetXAxisIndexValueInfo(
int xAxisIndex,
double min,
double max)
665 if (!m_XAxisIndexInfos.ContainsKey(xAxisIndex))
667 m_XAxisIndexInfos[xAxisIndex] =
new AxisIndexValueInfo()
675 m_XAxisIndexInfos[xAxisIndex].min = min;
676 m_XAxisIndexInfos[xAxisIndex].max = max;
680 internal void SetYAxisIndexValueInfo(
int yAxisIndex,
double min,
double max)
682 if (!m_YAxisIndexInfos.ContainsKey(yAxisIndex))
684 m_YAxisIndexInfos[yAxisIndex] =
new AxisIndexValueInfo()
692 m_YAxisIndexInfos[yAxisIndex].min = min;
693 m_YAxisIndexInfos[yAxisIndex].max = max;
697 internal bool IsXAxisIndexValue(
int axisIndex)
699 return m_XAxisIndexInfos.ContainsKey(axisIndex);
702 internal bool IsYAxisIndexValue(
int axisIndex)
704 return m_YAxisIndexInfos.ContainsKey(axisIndex);
707 internal void GetXAxisIndexValue(
int axisIndex, out
double min, out
double max)
711 if (m_XAxisIndexInfos.ContainsKey(axisIndex))
713 var info = m_XAxisIndexInfos[axisIndex];
718 internal void GetYAxisIndexValue(
int axisIndex, out
double min, out
double max)
722 if (m_YAxisIndexInfos.ContainsKey(axisIndex))
724 var info = m_YAxisIndexInfos[axisIndex];
732 internal class DataZoomHandler : IComponentHandler
734 public CoordinateChart chart;
735 private Vector2 m_LastTouchPos0;
736 private Vector2 m_LastTouchPos1;
737 private bool m_CheckDataZoomLabel;
738 private float m_DataZoomLastStartIndex;
739 private float m_DataZoomLastEndIndex;
741 public DataZoomHandler(BaseChart chart)
743 this.chart = chart as CoordinateChart;
746 public void Init() { }
750 if (chart ==
null)
return;
751 foreach (var dataZoom
in chart.dataZooms)
753 CheckDataZoomScale(dataZoom);
754 CheckDataZoomLabel(dataZoom);
758 public void DrawBase(VertexHelper vh)
762 public void DrawTop(VertexHelper vh)
764 if (chart ==
null)
return;
765 foreach (var dataZoom
in chart.dataZooms)
767 switch (dataZoom.orient)
770 DrawHorizonalDataZoomSlider(vh, dataZoom);
773 DrawVerticalDataZoomSlider(vh, dataZoom);
779 public void OnBeginDrag(PointerEventData eventData)
781 if (chart ==
null)
return;
782 if (Input.touchCount > 1)
return;
784 if (!chart.ScreenPointToChartPoint(eventData.position, out pos))
788 foreach (var dataZoom
in chart.dataZooms)
790 if (!dataZoom.enable)
continue;
791 var grid = chart.GetDataZoomGridOrDefault(dataZoom);
792 if (dataZoom.supportInside && dataZoom.supportInsideDrag)
794 if (chart.IsInGrid(grid, pos))
796 dataZoom.runtimeCoordinateDrag =
true;
799 if (dataZoom.supportSlider)
801 if (!dataZoom.zoomLock)
803 if (dataZoom.IsInStartZoom(pos))
805 dataZoom.runtimeStartDrag =
true;
807 else if (dataZoom.IsInEndZoom(pos))
809 dataZoom.runtimeEndDrag =
true;
811 else if (dataZoom.IsInSelectedZoom(pos))
813 dataZoom.runtimeDrag =
true;
816 else if (dataZoom.IsInSelectedZoom(pos))
818 dataZoom.runtimeDrag =
true;
824 public void OnDrag(PointerEventData eventData)
826 if (chart ==
null)
return;
827 if (Input.touchCount > 1)
return;
828 foreach (var dataZoom
in chart.dataZooms)
830 var grid = chart.GetDataZoomGridOrDefault(dataZoom);
831 switch (dataZoom.orient)
834 var deltaPercent = eventData.delta.x / grid.runtimeWidth * 100;
835 OnDragInside(dataZoom, deltaPercent);
836 OnDragSlider(dataZoom, deltaPercent);
839 deltaPercent = eventData.delta.y / grid.runtimeHeight * 100;
840 OnDragInside(dataZoom, deltaPercent);
841 OnDragSlider(dataZoom, deltaPercent);
847 public void OnEndDrag(PointerEventData eventData)
849 if (chart ==
null)
return;
850 foreach (var dataZoom
in chart.dataZooms)
852 if (dataZoom.runtimeDrag || dataZoom.runtimeStartDrag || dataZoom.runtimeEndDrag
853 || dataZoom.runtimeCoordinateDrag)
855 chart.RefreshChart();
857 dataZoom.runtimeDrag =
false;
858 dataZoom.runtimeCoordinateDrag =
false;
859 dataZoom.runtimeStartDrag =
false;
860 dataZoom.runtimeEndDrag =
false;
863 public void OnPointerDown(PointerEventData eventData)
865 if (chart ==
null)
return;
866 if (Input.touchCount > 1)
return;
868 if (!chart.ScreenPointToChartPoint(eventData.position, out localPos))
872 foreach (var dataZoom
in chart.dataZooms)
874 var grid = chart.GetDataZoomGridOrDefault(dataZoom);
875 if (dataZoom.IsInStartZoom(localPos) ||
876 dataZoom.IsInEndZoom(localPos))
880 if (dataZoom.IsInZoom(localPos)
881 && !dataZoom.IsInSelectedZoom(localPos))
883 var pointerX = localPos.x;
884 var selectWidth = grid.runtimeWidth * (dataZoom.end - dataZoom.start) / 100;
885 var startX = pointerX - selectWidth / 2;
886 var endX = pointerX + selectWidth / 2;
887 if (startX < grid.runtimeX)
889 startX = grid.runtimeX;
890 endX = grid.runtimeX + selectWidth;
892 else if (endX > grid.runtimeX + grid.runtimeWidth)
894 endX = grid.runtimeX + grid.runtimeWidth;
895 startX = grid.runtimeX + grid.runtimeWidth - selectWidth;
897 var start = (startX - grid.runtimeX) / grid.runtimeWidth * 100;
898 var end = (endX - grid.runtimeX) / grid.runtimeWidth * 100;
899 UpdateDataZoomRange(dataZoom, start, end);
903 public void OnScroll(PointerEventData eventData)
905 if (chart ==
null)
return;
906 if (Input.touchCount > 1)
return;
908 if (!chart.ScreenPointToChartPoint(eventData.position, out pos))
return;
909 foreach (var dataZoom
in chart.dataZooms)
911 if (!dataZoom.enable || dataZoom.zoomLock)
continue;
912 var grid = chart.GetDataZoomGridOrDefault(dataZoom);
913 if ((dataZoom.supportInside && dataZoom.supportInsideScroll && chart.IsInGrid(grid, pos)) ||
914 dataZoom.IsInZoom(pos))
916 ScaleDataZoom(dataZoom, eventData.scrollDelta.y * dataZoom.scrollSensitivity);
921 private void OnDragInside(DataZoom dataZoom,
float deltaPercent)
923 if (deltaPercent == 0)
return;
924 if (Input.touchCount > 1)
return;
925 if (!dataZoom.supportInside || !dataZoom.supportInsideDrag)
return;
926 if (!dataZoom.runtimeCoordinateDrag)
return;
927 var diff = dataZoom.end - dataZoom.start;
928 if (deltaPercent > 0)
930 if (dataZoom.start > 0)
932 var start = dataZoom.start - deltaPercent;
933 if (start < 0) start = 0;
934 var end = start + diff;
935 UpdateDataZoomRange(dataZoom, start, end);
940 if (dataZoom.end < 100)
942 var end = dataZoom.end - deltaPercent;
943 if (end > 100) end = 100;
944 var start = end - diff;
945 UpdateDataZoomRange(dataZoom, start, end);
950 private void OnDragSlider(DataZoom dataZoom,
float deltaPercent)
952 if (Input.touchCount > 1)
return;
953 if (!dataZoom.supportSlider)
return;
954 if (dataZoom.runtimeStartDrag)
956 var start = dataZoom.start + deltaPercent;
957 if (start > dataZoom.end)
959 start = dataZoom.end;
960 dataZoom.runtimeEndDrag =
true;
961 dataZoom.runtimeStartDrag =
false;
963 UpdateDataZoomRange(dataZoom, start, dataZoom.end);
965 else if (dataZoom.runtimeEndDrag)
967 var end = dataZoom.end + deltaPercent;
968 if (end < dataZoom.start)
970 end = dataZoom.start;
971 dataZoom.runtimeStartDrag =
true;
972 dataZoom.runtimeEndDrag =
false;
974 UpdateDataZoomRange(dataZoom, dataZoom.start, end);
976 else if (dataZoom.runtimeDrag)
978 if (deltaPercent > 0)
980 if (dataZoom.end + deltaPercent > 100) deltaPercent = 100 - dataZoom.end;
984 if (dataZoom.start + deltaPercent < 0) deltaPercent = -dataZoom.start;
986 UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end + deltaPercent);
990 private void ScaleDataZoom(DataZoom dataZoom,
float delta)
992 var grid = chart.GetDataZoomGridOrDefault(dataZoom);
993 var deltaPercent = dataZoom.orient ==
Orient.Horizonal ?
994 Mathf.Abs(delta / grid.runtimeWidth * 100) :
995 Mathf.Abs(delta / grid.runtimeHeight * 100);
998 if (dataZoom.end <= dataZoom.start)
return;
999 UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end - deltaPercent);
1003 UpdateDataZoomRange(dataZoom, dataZoom.start - deltaPercent, dataZoom.end + deltaPercent);
1007 public void UpdateDataZoomRange(DataZoom dataZoom,
float start,
float end)
1009 if (end > 100) end = 100;
1010 if (start < 0) start = 0;
1011 if (end < start) end = start;
1012 dataZoom.start = start;
1014 if (dataZoom.realtime)
1016 chart.OnDataZoomRangeChanged(dataZoom);
1017 chart.RefreshChart();
1021 public void RefreshDataZoomLabel()
1023 m_CheckDataZoomLabel =
true;
1026 private void CheckDataZoomScale(DataZoom dataZoom)
1028 if (!dataZoom.enable || dataZoom.zoomLock || !dataZoom.supportInside || !dataZoom.supportInsideDrag)
return;
1030 if (Input.touchCount == 2)
1032 var touch0 = Input.GetTouch(0);
1033 var touch1 = Input.GetTouch(1);
1034 if (touch1.phase == TouchPhase.Began)
1036 m_LastTouchPos0 = touch0.position;
1037 m_LastTouchPos1 = touch1.position;
1039 else if (touch0.phase == TouchPhase.Moved || touch1.phase == TouchPhase.Moved)
1041 var tempPos0 = touch0.position;
1042 var tempPos1 = touch1.position;
1043 var currDist = Vector2.Distance(tempPos0, tempPos1);
1044 var lastDist = Vector2.Distance(m_LastTouchPos0, m_LastTouchPos1);
1045 var delta = (currDist - lastDist);
1046 ScaleDataZoom(dataZoom, delta / dataZoom.scrollSensitivity);
1047 m_LastTouchPos0 = tempPos0;
1048 m_LastTouchPos1 = tempPos1;
1053 private void CheckDataZoomLabel(DataZoom dataZoom)
1055 if (dataZoom.enable && dataZoom.supportSlider && dataZoom.showDetail)
1058 if (!chart.ScreenPointToChartPoint(Input.mousePosition, out local))
1060 dataZoom.SetLabelActive(
false);
1063 if (dataZoom.IsInSelectedZoom(local)
1064 || dataZoom.IsInStartZoom(local)
1065 || dataZoom.IsInEndZoom(local))
1067 dataZoom.SetLabelActive(
true);
1068 RefreshDataZoomLabel();
1072 dataZoom.SetLabelActive(
false);
1075 if (m_CheckDataZoomLabel && dataZoom.xAxisIndexs.Count > 0)
1077 m_CheckDataZoomLabel =
false;
1078 var xAxis = chart.GetXAxis(dataZoom.xAxisIndexs[0]);
1079 var startIndex = (int)((xAxis.data.Count - 1) * dataZoom.start / 100);
1080 var endIndex = (int)((xAxis.data.Count - 1) * dataZoom.end / 100);
1081 if (m_DataZoomLastStartIndex != startIndex || m_DataZoomLastEndIndex != endIndex)
1083 m_DataZoomLastStartIndex = startIndex;
1084 m_DataZoomLastEndIndex = endIndex;
1085 if (xAxis.data.Count > 0)
1087 dataZoom.SetStartLabelText(xAxis.data[startIndex]);
1088 dataZoom.SetEndLabelText(xAxis.data[endIndex]);
1090 else if (xAxis.IsTime())
1093 dataZoom.SetStartLabelText(
"");
1094 dataZoom.SetEndLabelText(
"");
1098 var start = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.start / 100;
1099 var end = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.end / 100;
1100 var hig = dataZoom.runtimeHeight;
1101 dataZoom.UpdateStartLabelPosition(
new Vector3(start - 10, chart.chartY + dataZoom.bottom + hig / 2));
1102 dataZoom.UpdateEndLabelPosition(
new Vector3(end + 10, chart.chartY + dataZoom.bottom + hig / 2));
1106 private void DrawHorizonalDataZoomSlider(VertexHelper vh, DataZoom dataZoom)
1108 if (!dataZoom.enable || !dataZoom.supportSlider)
return;
1109 var p1 =
new Vector3(dataZoom.runtimeX, dataZoom.runtimeY);
1110 var p2 =
new Vector3(dataZoom.runtimeX, dataZoom.runtimeY + dataZoom.runtimeHeight);
1111 var p3 =
new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY + dataZoom.runtimeHeight);
1112 var p4 =
new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY);
1113 var lineColor = dataZoom.lineStyle.GetColor(chart.theme.dataZoom.dataLineColor);
1114 var lineWidth = dataZoom.lineStyle.GetWidth(chart.theme.dataZoom.dataLineWidth);
1115 var borderWidth = dataZoom.borderWidth == 0 ? chart.theme.dataZoom.borderWidth : dataZoom.borderWidth;
1116 var borderColor = dataZoom.GetBorderColor(chart.theme.dataZoom.borderColor);
1117 var backgroundColor = dataZoom.GetBackgroundColor(chart.theme.dataZoom.backgroundColor);
1118 var areaColor = dataZoom.areaStyle.GetColor(chart.theme.dataZoom.dataAreaColor);
1119 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, backgroundColor);
1120 var centerPos =
new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth / 2,
1121 dataZoom.runtimeY + dataZoom.runtimeHeight / 2);
1122 UGL.DrawBorder(vh, centerPos, dataZoom.runtimeWidth, dataZoom.runtimeHeight, borderWidth, borderColor);
1123 if (dataZoom.showDataShadow && chart.series.Count > 0)
1125 Serie serie = chart.series.list[0];
1126 Axis axis = chart.GetYAxis(0);
1127 var showData = serie.GetDataList(
null);
1128 float scaleWid = dataZoom.runtimeWidth / (showData.Count - 1);
1129 Vector3 lp = Vector3.zero;
1130 Vector3 np = Vector3.zero;
1131 double minValue = 0;
1132 double maxValue = 0;
1133 SeriesHelper.GetYMinMaxValue(chart.series,
null, 0, chart.IsValue(), axis.inverse, out minValue, out maxValue);
1134 AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue,
true);
1137 var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist;
1138 var maxCount = showData.Count;
1139 if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (dataZoom.runtimeWidth / sampleDist));
1140 if (rate < 1) rate = 1;
1141 var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :
1142 chart.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
1143 var dataChanging =
false;
1144 for (
int i = 0; i < maxCount; i += rate)
1146 double value = chart.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,
1147 serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis);
1148 float pX = dataZoom.runtimeX + i * scaleWid;
1149 float dataHig = (float)((maxValue - minValue) == 0 ? 0 :
1150 (value - minValue) / (maxValue - minValue) * dataZoom.runtimeHeight);
1151 np =
new Vector3(pX, chart.chartY + dataZoom.bottom + dataHig);
1154 UGL.DrawLine(vh, lp, np, lineWidth, lineColor);
1155 Vector3 alp =
new Vector3(lp.x, lp.y - lineWidth);
1156 Vector3 anp =
new Vector3(np.x, np.y - lineWidth);
1158 Vector3 tnp =
new Vector3(np.x, chart.chartY + dataZoom.bottom + lineWidth);
1159 Vector3 tlp =
new Vector3(lp.x, chart.chartY + dataZoom.bottom + lineWidth);
1160 UGL.DrawQuadrilateral(vh, alp, anp, tnp, tlp, areaColor);
1166 chart.RefreshTopPainter();
1169 switch (dataZoom.rangeMode)
1171 case DataZoom.RangeMode.Percent:
1172 var start = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.start / 100;
1173 var end = dataZoom.runtimeX + dataZoom.runtimeWidth * dataZoom.end / 100;
1174 var fillerColor = dataZoom.GetFillerColor(chart.theme.dataZoom.fillerColor);
1176 p1 =
new Vector2(start, dataZoom.runtimeY);
1177 p2 =
new Vector2(start, dataZoom.runtimeY + dataZoom.runtimeHeight);
1178 p3 =
new Vector2(end, dataZoom.runtimeY + dataZoom.runtimeHeight);
1179 p4 =
new Vector2(end, dataZoom.runtimeY);
1180 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, fillerColor);
1181 UGL.DrawLine(vh, p1, p2, lineWidth, fillerColor);
1182 UGL.DrawLine(vh, p3, p4, lineWidth, fillerColor);
1187 private void DrawVerticalDataZoomSlider(VertexHelper vh, DataZoom dataZoom)
1189 if (!dataZoom.enable || !dataZoom.supportSlider)
return;
1190 var p1 =
new Vector3(dataZoom.runtimeX, dataZoom.runtimeY);
1191 var p2 =
new Vector3(dataZoom.runtimeX, dataZoom.runtimeY + dataZoom.runtimeHeight);
1192 var p3 =
new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY + dataZoom.runtimeHeight);
1193 var p4 =
new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth, dataZoom.runtimeY);
1194 var lineColor = dataZoom.lineStyle.GetColor(chart.theme.dataZoom.dataLineColor);
1195 var lineWidth = dataZoom.lineStyle.GetWidth(chart.theme.dataZoom.dataLineWidth);
1196 var borderWidth = dataZoom.borderWidth == 0 ? chart.theme.dataZoom.borderWidth : dataZoom.borderWidth;
1197 var borderColor = dataZoom.GetBorderColor(chart.theme.dataZoom.borderColor);
1198 var backgroundColor = dataZoom.GetBackgroundColor(chart.theme.dataZoom.backgroundColor);
1199 var areaColor = dataZoom.areaStyle.GetColor(chart.theme.dataZoom.dataAreaColor);
1200 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, backgroundColor);
1201 var centerPos =
new Vector3(dataZoom.runtimeX + dataZoom.runtimeWidth / 2,
1202 dataZoom.runtimeY + dataZoom.runtimeHeight / 2);
1203 UGL.DrawBorder(vh, centerPos, dataZoom.runtimeWidth, dataZoom.runtimeHeight, borderWidth, borderColor);
1204 if (dataZoom.showDataShadow && chart.series.Count > 0)
1206 Serie serie = chart.series.list[0];
1207 Axis axis = chart.GetYAxis(0);
1208 var showData = serie.GetDataList(
null);
1209 float scaleWid = dataZoom.runtimeHeight / (showData.Count - 1);
1210 Vector3 lp = Vector3.zero;
1211 Vector3 np = Vector3.zero;
1212 double minValue = 0;
1213 double maxValue = 0;
1214 SeriesHelper.GetYMinMaxValue(chart.series,
null, 0, chart.IsValue(), axis.inverse, out minValue, out maxValue);
1215 AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue,
true);
1218 var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist;
1219 var maxCount = showData.Count;
1220 if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (dataZoom.runtimeHeight / sampleDist));
1221 if (rate < 1) rate = 1;
1222 var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :
1223 chart.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);
1224 var dataChanging =
false;
1225 for (
int i = 0; i < maxCount; i += rate)
1227 double value = chart.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,
1228 serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis);
1229 float pY = dataZoom.runtimeY + i * scaleWid;
1230 float dataHig = (maxValue - minValue) == 0 ? 0 :
1231 (
float)((value - minValue) / (maxValue - minValue) * dataZoom.runtimeWidth);
1232 np =
new Vector3(chart.chartX + chart.chartWidth - dataZoom.right - dataHig, pY);
1235 UGL.DrawLine(vh, lp, np, lineWidth, lineColor);
1236 Vector3 alp =
new Vector3(lp.x, lp.y - lineWidth);
1237 Vector3 anp =
new Vector3(np.x, np.y - lineWidth);
1239 Vector3 tnp =
new Vector3(np.x, chart.chartY + dataZoom.bottom + lineWidth);
1240 Vector3 tlp =
new Vector3(lp.x, chart.chartY + dataZoom.bottom + lineWidth);
1241 UGL.DrawQuadrilateral(vh, alp, anp, tnp, tlp, areaColor);
1247 chart.RefreshTopPainter();
1250 switch (dataZoom.rangeMode)
1252 case DataZoom.RangeMode.Percent:
1253 var start = dataZoom.runtimeY + dataZoom.runtimeHeight * dataZoom.start / 100;
1254 var end = dataZoom.runtimeY + dataZoom.runtimeHeight * dataZoom.end / 100;
1255 var fillerColor = dataZoom.GetFillerColor(chart.theme.dataZoom.fillerColor);
1257 p1 =
new Vector2(dataZoom.runtimeX, start);
1258 p2 =
new Vector2(dataZoom.runtimeX + dataZoom.runtimeWidth, start);
1259 p3 =
new Vector2(dataZoom.runtimeX + dataZoom.runtimeWidth, end);
1260 p4 =
new Vector2(dataZoom.runtimeX, end);
1261 UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, fillerColor);
1262 UGL.DrawLine(vh, p1, p2, lineWidth, fillerColor);
1263 UGL.DrawLine(vh, p3, p4, lineWidth, fillerColor);