hqchart 1.1.14643 → 1.1.14648

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3147,7 +3147,10 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3147
3147
  },
3148
3148
 
3149
3149
  //锁十字光标
3150
- LockCorssCursor:{ X:{ Enable:false } }
3150
+ LockCorssCursor:{ X:{ Enable:false } },
3151
+
3152
+ //图形中的单元选中状态
3153
+ MapIndexChartCache:new Map(), //key 指标GUID
3151
3154
  };
3152
3155
 
3153
3156
  this.VerticalDrag; //通过X轴左右拖动数据(手势才有)
@@ -3824,6 +3827,56 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3824
3827
  return false;
3825
3828
  }
3826
3829
 
3830
+ //点击图新内部元素
3831
+ this.TryClickChartCell=function(x, y, e)
3832
+ {
3833
+ var result=null;
3834
+ for(var i=0;i<this.ChartPaint.length;++i)
3835
+ {
3836
+ var item=this.ChartPaint[i];
3837
+ if (!item.ClickCell) continue;
3838
+ if (item.IsHideScriptIndex()) continue;
3839
+
3840
+ result=item.ClickCell(x,y,e);
3841
+ if (result) return result;
3842
+ }
3843
+
3844
+ for(var i=0;i<this.OverlayChartPaint.length;++i)
3845
+ {
3846
+ var item=this.OverlayChartPaint[i];
3847
+ if (!item.ClickCell) continue;
3848
+
3849
+ result=item.ClickCell(x,y,e);
3850
+ if (result) return result;
3851
+ }
3852
+
3853
+ for(var i=0,j=0,k=0;i<this.Frame.SubFrame.length;++i)
3854
+ {
3855
+ var item=this.Frame.SubFrame[i];
3856
+ if (!IFrameSplitOperator.IsNonEmptyArray(item.OverlayIndex)) continue;
3857
+
3858
+ for(j=0;j<item.OverlayIndex.length;++j)
3859
+ {
3860
+ var overlayItem=item.OverlayIndex[j];
3861
+ if (!IFrameSplitOperator.IsNonEmptyArray(overlayItem.ChartPaint)) continue;
3862
+
3863
+ for(var k=0;k<overlayItem.ChartPaint.length; ++k)
3864
+ {
3865
+ var chart=overlayItem.ChartPaint[k];
3866
+ if (!chart.IsShow) continue;
3867
+ if (chart.IsHideScriptIndex()) continue;
3868
+ if (chart.ClickCell)
3869
+ {
3870
+ result=chart.ClickCell(x,y,e);
3871
+ if (result) return result;
3872
+ }
3873
+ }
3874
+ }
3875
+ }
3876
+
3877
+ return null;
3878
+ }
3879
+
3827
3880
  this.TryMouseMove_CustomChartDrag=function(sendData)
3828
3881
  {
3829
3882
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CUSTOM_DRAG_MOUSE_MOVE);
@@ -4135,23 +4188,41 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
4135
4188
  }, 250);
4136
4189
 
4137
4190
  var bSelectedChartChanged=false;
4138
- if (this.SelectedChart.EnableSelected)
4191
+ var clickCellData=this.TryClickChartCell(x,y,e); //点击图形子元素
4192
+
4193
+ if (clickCellData)
4194
+ {
4195
+ if (clickCellData.Redraw===true) bRedraw=true;
4196
+ }
4197
+ else
4139
4198
  {
4140
- var selectChart=this.PtInChart(x,y);
4141
- if (selectChart)
4199
+ if (this.SelectedChart.EnableSelected) //整体图形选中
4142
4200
  {
4143
- if (this.SelectedChart.Selected.Identify!=selectChart.Identify)
4201
+ var selectChart=this.PtInChart(x,y);
4202
+ if (selectChart)
4144
4203
  {
4145
- this.SelectedChart.Selected.Identify=selectChart.Identify;
4146
- this.SelectedChart.Selected.Chart=selectChart.Chart;
4147
- bSelectedChartChanged=true;
4148
- }
4204
+ if (this.SelectedChart.Selected.Identify!=selectChart.Identify)
4205
+ {
4206
+ this.SelectedChart.Selected.Identify=selectChart.Identify;
4207
+ this.SelectedChart.Selected.Chart=selectChart.Chart;
4208
+ bSelectedChartChanged=true;
4209
+ }
4149
4210
 
4150
- if (this.EnableIndexChartDrag)
4211
+ if (this.EnableIndexChartDrag)
4212
+ {
4213
+ this.IndexChartDrag={ SelectedChart:selectChart, LastMove:{X:x, Y:y}, Click:{X:x, Y:y } };
4214
+ this.IndexChartDrag.Info=this.GetSelectedChartInfo(selectChart);
4215
+ if (this.IndexChartDrag.Info) this.IndexChartDrag.Info.FrameID=this.Frame.PtInFrame(x,y);
4216
+ }
4217
+ }
4218
+ else
4151
4219
  {
4152
- this.IndexChartDrag={ SelectedChart:selectChart, LastMove:{X:x, Y:y}, Click:{X:x, Y:y } };
4153
- this.IndexChartDrag.Info=this.GetSelectedChartInfo(selectChart);
4154
- if (this.IndexChartDrag.Info) this.IndexChartDrag.Info.FrameID=this.Frame.PtInFrame(x,y);
4220
+ if (this.SelectedChart.Selected.Identify)
4221
+ {
4222
+ this.SelectedChart.Selected.Identify=null;
4223
+ this.SelectedChart.Selected.Chart=null;
4224
+ bSelectedChartChanged=true;
4225
+ }
4155
4226
  }
4156
4227
  }
4157
4228
  else
@@ -4159,19 +4230,10 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
4159
4230
  if (this.SelectedChart.Selected.Identify)
4160
4231
  {
4161
4232
  this.SelectedChart.Selected.Identify=null;
4162
- this.SelectedChart.Selected.Chart=null;
4163
4233
  bSelectedChartChanged=true;
4164
4234
  }
4165
4235
  }
4166
4236
  }
4167
- else
4168
- {
4169
- if (this.SelectedChart.Selected.Identify)
4170
- {
4171
- this.SelectedChart.Selected.Identify=null;
4172
- bSelectedChartChanged=true;
4173
- }
4174
- }
4175
4237
 
4176
4238
  if ((drawPictureActive.Select.Guid!=null && this.SelectChartDrawPicture==null) || bSelectedChartChanged)
4177
4239
  {
@@ -10017,6 +10079,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10017
10079
  frame.Canvas=this.Canvas;
10018
10080
  frame.MainFrame=subFrame.Frame;
10019
10081
  frame.ChartBorder=subFrame.Frame.ChartBorder;
10082
+ frame.GlobalOption=this.GlobalOption;
10020
10083
  if (findOverlayItem) frame.IsShow=findOverlayItem.Frame.IsShow;
10021
10084
  //if (obj.IsShareY===true) frame.IsShareY=true;
10022
10085
  frame.YSplitOperator=new FrameSplitY();
@@ -25485,6 +25548,59 @@ function IChartPainting()
25485
25548
  else return item.Date;
25486
25549
  }
25487
25550
 
25551
+ //保存图形状态
25552
+ this.SaveCacheData=function(name, value)
25553
+ {
25554
+ if (!this.ChartFrame || !this.ChartFrame.GlobalOption) return false;
25555
+ var mapIndexCache=this.ChartFrame.GlobalOption.MapIndexChartCache;
25556
+ if (!mapIndexCache) return false;
25557
+
25558
+ if (!this.Script || !this.Script.Guid) return false;
25559
+ if (!this.Name) return false;
25560
+
25561
+ var id=this.Script.Guid; //指标ID;
25562
+ if (!mapIndexCache.has(id))
25563
+ {
25564
+ mapIndexCache.set(id, { MapData:new Map() });
25565
+ }
25566
+
25567
+ var mapItem=mapIndexCache.get(id);
25568
+ var key=`${this.Name}-${name}`;
25569
+ mapItem.MapData.set(key, value);
25570
+
25571
+ return true;
25572
+ }
25573
+
25574
+ //获取缓存数据 返回数据 out:{ Data, Key, IndexGuid }
25575
+ this.GetCacheData=function(name, out)
25576
+ {
25577
+ if (!this.ChartFrame || !this.ChartFrame.GlobalOption) return false;
25578
+ var mapIndexCache=this.ChartFrame.GlobalOption.MapIndexChartCache;
25579
+ if (!mapIndexCache) return false;
25580
+
25581
+ if (!this.Script || !this.Script.Guid) return false;
25582
+ if (!this.Name) return false;
25583
+
25584
+ var id=this.Script.Guid; //指标ID;
25585
+ if (!mapIndexCache.has(id)) return false;
25586
+
25587
+ var mapItem=mapIndexCache.get(id);
25588
+ var key=`${this.Name}-${name}`;
25589
+
25590
+ if (!mapItem.MapData.has(key)) return false;
25591
+
25592
+ var value=mapItem.MapData.get(key);
25593
+ if (out)
25594
+ {
25595
+ out.Data=value;
25596
+ out.Key=key;
25597
+ out.IndexGuid=id;
25598
+ }
25599
+
25600
+ return true;
25601
+ }
25602
+
25603
+
25488
25604
  //数据导出 数据格式 [{ Title:数据名称, Data:[] }]
25489
25605
  //this.ExportData=function(aryKData) { }
25490
25606
 
@@ -26198,6 +26314,12 @@ function IChartPainting()
26198
26314
  }
26199
26315
  }
26200
26316
 
26317
+ //缓存键值
26318
+ IChartPainting.CACHE_KEY=
26319
+ {
26320
+ SELECTED:"_Selected_Key_", //图形元素选中(单选)
26321
+ }
26322
+
26201
26323
 
26202
26324
  //缩放因子
26203
26325
  /*
@@ -32603,7 +32725,7 @@ function ChartKLineTable()
32603
32725
  this.newMethod();
32604
32726
  delete this.newMethod;
32605
32727
 
32606
- this.ClassName='ChartKlineTable'; //类名
32728
+ this.ClassName='ChartKLineTable'; //类名
32607
32729
  this.Data;
32608
32730
  this.RowName;
32609
32731
  this.RowNamePosition=1; //0=不显示 1=左边内部 2=左边外部 3=右边外部
@@ -44000,8 +44122,11 @@ function ChartDrawSVG()
44000
44122
  this.BuildKeyCallback=null;
44001
44123
  this.MapCache=null; //key=date/date-time value={ Data:[] }
44002
44124
 
44003
- this.AryDrawDetail=[]; //需要绘制的文字信息
44004
- this.EnalbeDetailNoOverlap=false; //详情重叠不显示
44125
+ this.AryDrawDetail=[]; //需要绘制的文字信息
44126
+ this.EnalbeDetailNoOverlap=false; //详情重叠不显示
44127
+ this.EnableClick=false; //是否支持点击
44128
+ this.PixelRatio=GetDevicePixelRatio();
44129
+ this.SelectedItemCache=null;
44005
44130
 
44006
44131
  this.BuildKey=function(item)
44007
44132
  {
@@ -44039,6 +44164,7 @@ function ChartDrawSVG()
44039
44164
  this.AryDrawRect=[];
44040
44165
  this.AryDrawDetail=[];
44041
44166
  this.AutoYOffset=0;
44167
+ this.SelectedItemCache=null;
44042
44168
 
44043
44169
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44044
44170
  if (this.IsShowIndexTitleOnly()) return;
@@ -44049,13 +44175,17 @@ function ChartDrawSVG()
44049
44175
 
44050
44176
  if (this.EnalbeDetailNoOverlap) this.DrawOnVerlapDetail();
44051
44177
 
44178
+ this.DrawSelectedItem();
44179
+
44052
44180
  this.AryDrawDetail=[];
44181
+ this.SelectedItemCache=null;
44053
44182
  }
44054
44183
 
44055
44184
  this.DrawDetail=function(rtSVG, data, svgItem)
44056
44185
  {
44057
44186
  if (!IFrameSplitOperator.IsNonEmptyArray(data.Content)) return;
44058
44187
 
44188
+ var bSelected=this.IsSelectedItem(svgItem); //是否是选中点
44059
44189
  var lefMargin=2;
44060
44190
  var rightMargin=2;
44061
44191
  var itemSpace=2;
@@ -44116,13 +44246,15 @@ function ChartDrawSVG()
44116
44246
  }
44117
44247
  }
44118
44248
 
44249
+ if (bSelected) this.SelectedItemCache.Detail={ AryText:aryText, Rect:rtBorder, Data:svgItem };
44250
+
44119
44251
  if (this.EnalbeDetailNoOverlap) //启动重叠不会 先不画只计算位置, 后面统一画
44120
44252
  {
44121
44253
  this.AryDrawDetail.push({ Rect:rtBorder, AryText:aryText, Data:svgItem });
44122
44254
  return;
44123
44255
  }
44124
44256
 
44125
- this.DrawDetailText(data,aryText,rtBorder);
44257
+ if (!bSelected) this.DrawDetailText(data,aryText,rtBorder);
44126
44258
 
44127
44259
  this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail", Data:svgItem } );
44128
44260
  }
@@ -44169,7 +44301,9 @@ function ChartDrawSVG()
44169
44301
 
44170
44302
  if (this.IsRectOverlap(rtBorder)) continue;
44171
44303
 
44172
- this.DrawDetailText(drawItem.Data.Detail, drawItem.AryText, rtBorder);
44304
+ var bSelected=this.IsSelectedItem(drawItem.Data); //是否是选中点
44305
+
44306
+ if (!bSelected) this.DrawDetailText(drawItem.Data.Detail, drawItem.AryText, rtBorder);
44173
44307
 
44174
44308
  this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail", Data:drawItem.Data } );
44175
44309
  }
@@ -44334,6 +44468,12 @@ function ChartDrawSVG()
44334
44468
  }
44335
44469
  }
44336
44470
 
44471
+ this.IsSelectedItem=function(item)
44472
+ {
44473
+ if (!this.SelectedItemCache) return false;
44474
+ return this.SelectedItemCache.ID==item.ID;
44475
+ }
44476
+
44337
44477
  this.DrawSVGV2=function()
44338
44478
  {
44339
44479
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
@@ -44349,7 +44489,7 @@ function ChartDrawSVG()
44349
44489
  var distanceWidth=this.ChartFrame.DistanceWidth;
44350
44490
  var isMinute=this.IsMinuteFrame();
44351
44491
  var border=this.GetBorder();
44352
- var pixelRatio = GetDevicePixelRatio();
44492
+ this.PixelRatio=GetDevicePixelRatio();
44353
44493
 
44354
44494
  if (this.IsHScreen)
44355
44495
  {
@@ -44364,7 +44504,11 @@ function ChartDrawSVG()
44364
44504
  var bottom=border.BottomEx;
44365
44505
  }
44366
44506
 
44367
- var x,y,price;
44507
+ var selectedData={ };
44508
+ if (this.GetCacheData(IChartPainting.CACHE_KEY.SELECTED, selectedData)) //选中图标
44509
+ this.SelectedItemCache={ ID:selectedData.Data.ID };
44510
+
44511
+ var x;
44368
44512
  var setKey=new Set(); //已经画过的Key就不再用了
44369
44513
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44370
44514
  {
@@ -44391,147 +44535,200 @@ function ChartDrawSVG()
44391
44535
  {
44392
44536
  var item=mapItem.Data[k];
44393
44537
 
44394
- if (item.Value=="Top") y=top;
44395
- else if (item.Value=="Bottom") y=bottom;
44396
- else
44538
+ if (this.IsSelectedItem(item))
44397
44539
  {
44398
- if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
44399
- else price=item.Value;
44400
-
44401
- y=this.ChartFrame.GetYFromData(price, false);
44540
+ this.SelectedItemCache.Item=item;
44541
+ this.SelectedItemCache.KItem=kItem;
44542
+ this.SelectedItemCache.Index=i;
44543
+ this.SelectedItemCache.X=x;
44544
+ this.SelectedItemCache.Top=top;
44545
+ this.SelectedItemCache.Bottom=bottom;
44402
44546
  }
44403
- if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
44404
44547
 
44405
- var svgItem=item.SVG;
44406
- if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
44548
+ this.DrawSVGItem(item, kItem, i, x, top, bottom);
44549
+ }
44407
44550
 
44408
- if (this.AutoPosition)
44409
- {
44410
- var pt={ X:x, Y:y };
44411
- this.CalculateShowPosition(item, pt); //重新计算位置
44412
- x=pt.X;
44413
- y=pt.Y;
44414
- }
44551
+ setKey.add(key);
44552
+ }
44553
+ }
44415
44554
 
44416
- var fontSVG=`${svgItem.Size}px ${this.Family}`;
44417
- this.Canvas.font=fontSVG;
44418
- var halfSize=svgItem.Size/2;
44419
- var textBaseline='bottom';
44420
- var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
44421
- if (svgItem.VAlign===0)
44422
- {
44423
- textBaseline="top";
44424
- rtSVG.Top=y;
44425
- rtSVG.Bottom=rtSVG.Top+svgItem.Size;
44426
- }
44427
- else if (svgItem.VAlign===1)
44428
- {
44429
- textBaseline='middle';
44430
- rtSVG.Top=y-svgItem.Size/2;
44431
- rtSVG.Bottom=rtSVG.Top+svgItem.Size;
44432
- }
44433
44555
 
44434
- if (rtSVG.Top<0)
44435
- {
44436
- rtSVG.Top=0;
44437
- rtSVG.Bottom=svgItem.Size;
44438
- y=rtSVG.Bottom;
44439
- }
44556
+ this.GetYFromData=function(value, kItem, top, bottom)
44557
+ {
44558
+ if (value=="Top") return top;
44559
+ if (value=="Bottom") return bottom;
44560
+
44561
+ var price;
44562
+ if (IFrameSplitOperator.IsString(value)) price=this.GetKValue(kItem,value);
44563
+ else price=value;
44440
44564
 
44441
- this.Canvas.textBaseline=textBaseline;
44442
- this.Canvas.textAlign='center';
44443
- this.Canvas.fillStyle = svgItem.Color;
44444
- this.Canvas.fillText(svgItem.Symbol, x, y);
44565
+ var y=this.ChartFrame.GetYFromData(price, false);
44445
44566
 
44446
- this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
44567
+ return y;
44568
+ }
44447
44569
 
44448
- if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
44570
+ this.DrawSVGItem=function(item, kItem, index, x, top, bottom)
44571
+ {
44572
+ var y=this.GetYFromData(item.Value, kItem, top, bottom);
44573
+ if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
44449
44574
 
44450
- //文字
44451
- if (item.Text && item.Text.Content && this.TextFont)
44452
- {
44453
- var textItem=item.Text;
44454
- this.Canvas.font=this.TextFont;
44455
- this.Canvas.fillStyle=textItem.Color;
44456
- var yText=y;
44457
- if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
44458
- this.Canvas.fillText(textItem.Content, x, yText);
44459
- }
44575
+ var svgItem=item.SVG;
44576
+ if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
44460
44577
 
44461
- if (item.Detail)
44462
- {
44463
- this.DrawDetail(rtSVG,item.Detail, item);
44464
- }
44465
-
44466
- //连线
44467
- if (item.Line)
44468
- {
44469
- var lineItem=item.Line;
44470
- var price=null, yPrice=null;
44471
- if (lineItem.Value=="Bottom")
44472
- {
44473
- yPrice=bottom;
44474
- }
44475
- else if (lineItem.Value=="Top")
44476
- {
44477
- yPrice=top;
44478
- }
44479
- else
44480
- {
44481
- if (IFrameSplitOperator.IsString(lineItem.Value)) price=this.GetKValue(kItem,lineItem.Value);
44482
- else if (IFrameSplitOperator.IsNumber(lineItem.Value)) price=lineItem.Value;
44578
+ if (this.AutoPosition)
44579
+ {
44580
+ var pt={ X:x, Y:y };
44581
+ this.CalculateShowPosition(item, pt); //重新计算位置
44582
+ x=pt.X;
44583
+ y=pt.Y;
44584
+ }
44483
44585
 
44484
- if (!IFrameSplitOperator.IsNumber(price)) continue;
44485
- yPrice=this.ChartFrame.GetYFromData(price);
44486
- }
44487
-
44488
- if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
44586
+ var bSelected=this.IsSelectedItem(item); //是否是选中点
44489
44587
 
44490
- var yText;
44491
- if (yPrice<rtSVG.Top)
44492
- {
44493
- yText=rtSVG.Top;
44494
- if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
44495
- {
44496
- //yPrice+=lineItem.Blank;
44497
- yText-=lineItem.SVGBlank;
44498
- }
44499
- }
44500
- else
44501
- {
44502
- yText=rtSVG.Bottom;
44503
- if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
44504
- {
44505
- //yPrice-=lineItem.Blank;
44506
- yText+=lineItem.SVGBlank;
44507
- }
44508
- }
44588
+ var fontSVG=`${svgItem.Size}px ${this.Family}`;
44589
+ this.Canvas.font=fontSVG;
44590
+ var halfSize=svgItem.Size/2;
44591
+ var textBaseline='bottom';
44592
+ var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
44593
+ if (svgItem.VAlign===0)
44594
+ {
44595
+ textBaseline="top";
44596
+ rtSVG.Top=y;
44597
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
44598
+ }
44599
+ else if (svgItem.VAlign===1)
44600
+ {
44601
+ textBaseline='middle';
44602
+ rtSVG.Top=y-svgItem.Size/2;
44603
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
44604
+ }
44509
44605
 
44510
- if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
44511
- var lineWidth=1*pixelRatio;
44512
- if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
44513
- this.Canvas.lineWidth=lineWidth; //线宽
44514
- this.Canvas.strokeStyle = lineItem.Color;
44515
- this.Canvas.beginPath();
44606
+ if (rtSVG.Top<0)
44607
+ {
44608
+ rtSVG.Top=0;
44609
+ rtSVG.Bottom=svgItem.Size;
44610
+ y=rtSVG.Bottom;
44611
+ }
44516
44612
 
44517
- if (this.IsHScreen)
44518
- {
44519
- this.Canvas.moveTo(yText, ToFixedPoint(x));
44520
- this.Canvas.lineTo(yPrice,ToFixedPoint(x));
44521
- }
44522
- else
44523
- {
44524
- this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
44525
- this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
44526
- }
44527
-
44528
- this.Canvas.stroke();
44529
- this.Canvas.setLineDash([]);
44530
- }
44613
+ if (!bSelected)
44614
+ {
44615
+ this.Canvas.textBaseline=textBaseline;
44616
+ this.Canvas.textAlign='center';
44617
+ this.Canvas.fillStyle = svgItem.Color;
44618
+ this.Canvas.fillText(svgItem.Symbol, x, y);
44619
+ }
44620
+ else
44621
+ {
44622
+ this.SelectedItemCache.RectSVG=rtSVG; //保存图标的位置
44623
+ this.SelectedItemCache.SVGConfig={ Font:fontSVG, TextBaseline:textBaseline, X:x, Y:y };
44624
+ }
44625
+
44626
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
44627
+
44628
+ if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:index, Item:item });
44629
+
44630
+ //图标内的文字
44631
+ if (!bSelected && item.Text && item.Text.Content && this.TextFont)
44632
+ {
44633
+ var textItem=item.Text;
44634
+ this.Canvas.font=this.TextFont;
44635
+ this.Canvas.fillStyle=textItem.Color;
44636
+ var yText=y;
44637
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
44638
+ this.Canvas.fillText(textItem.Content, x, yText);
44639
+ }
44640
+
44641
+ //图标左右两边文字
44642
+ if (item.Detail) this.DrawDetail(rtSVG, item.Detail, item);
44643
+
44644
+ //连线
44645
+ if (!bSelected && item.Line) this.DrawVerticalLine(item,kItem,x, rtSVG, top, bottom);
44646
+ }
44647
+
44648
+ //绘制垂直连线
44649
+ this.DrawVerticalLine=function(item, kItem, x, rtSVG, top, bottom)
44650
+ {
44651
+ if (!item.Line) return;
44652
+
44653
+ var lineItem=item.Line;
44654
+ var yPrice=this.GetYFromData(lineItem.Value, kItem, top, bottom)
44655
+ if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) return;
44656
+
44657
+ var yText;
44658
+ if (yPrice<rtSVG.Top)
44659
+ {
44660
+ yText=rtSVG.Top;
44661
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
44662
+ {
44663
+ //yPrice+=lineItem.Blank;
44664
+ yText-=lineItem.SVGBlank;
44665
+ }
44666
+ }
44667
+ else
44668
+ {
44669
+ yText=rtSVG.Bottom;
44670
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
44671
+ {
44672
+ //yPrice-=lineItem.Blank;
44673
+ yText+=lineItem.SVGBlank;
44531
44674
  }
44675
+ }
44532
44676
 
44533
- setKey.add(key);
44677
+ if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
44678
+ var lineWidth=1*this.PixelRatio;
44679
+ if (lineItem.Width>0) lineWidth=lineItem.Width*this.PixelRatio;
44680
+ this.Canvas.lineWidth=lineWidth; //线宽
44681
+ this.Canvas.strokeStyle = lineItem.Color;
44682
+ this.Canvas.beginPath();
44683
+
44684
+ if (this.IsHScreen)
44685
+ {
44686
+ this.Canvas.moveTo(yText, ToFixedPoint(x));
44687
+ this.Canvas.lineTo(yPrice,ToFixedPoint(x));
44688
+ }
44689
+ else
44690
+ {
44691
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
44692
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
44534
44693
  }
44694
+
44695
+ this.Canvas.stroke();
44696
+ this.Canvas.setLineDash([]);
44697
+ }
44698
+
44699
+ this.DrawSelectedItem=function()
44700
+ {
44701
+ if (!this.SelectedItemCache || !this.SelectedItemCache.Item) return;
44702
+
44703
+ var selecteItem=this.SelectedItemCache;
44704
+ var item=selecteItem.Item;
44705
+ var kItem=selecteItem.KItem;
44706
+ var top=selecteItem.Top;
44707
+ var bottom=selecteItem.Bottom;
44708
+ var rtSVG=selecteItem.RectSVG;
44709
+ var svgItem=item.SVG;
44710
+ var config=selecteItem.SVGConfig;
44711
+
44712
+ var x=config.X, y=config.Y;
44713
+ this.Canvas.font=config.Font;
44714
+ this.Canvas.textBaseline=config.TextBaseline;
44715
+ this.Canvas.textAlign='center';
44716
+ this.Canvas.fillStyle = svgItem.Color;
44717
+ this.Canvas.fillText(svgItem.Symbol, config.X, config.Y);
44718
+
44719
+ if (item.Text && item.Text.Content && this.TextFont)
44720
+ {
44721
+ var textItem=item.Text;
44722
+ this.Canvas.font=this.TextFont;
44723
+ this.Canvas.fillStyle=textItem.Color;
44724
+ var yText=y;
44725
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
44726
+ this.Canvas.fillText(textItem.Content, x, yText);
44727
+ }
44728
+
44729
+ if (item.Line) this.DrawVerticalLine(item, kItem, x, rtSVG, top, bottom);
44730
+
44731
+ if (selecteItem.Detail) this.DrawDetailText(selecteItem.Item.Detail, selecteItem.Detail.AryText, selecteItem.Detail.Rect);
44535
44732
  }
44536
44733
 
44537
44734
  this.GetMaxMin=function()
@@ -44570,8 +44767,9 @@ function ChartDrawSVG()
44570
44767
  this.GetTooltipData=function(x,y,tooltip)
44571
44768
  {
44572
44769
  if (!this.IsShow) return false;
44770
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.TooltipRect)) return;
44573
44771
 
44574
- for(var i=0;i<this.TooltipRect.length;++i)
44772
+ for(var i=this.TooltipRect.length-1; i>=0; --i)
44575
44773
  {
44576
44774
  var item=this.TooltipRect[i];
44577
44775
  if (!item.Rect) continue;
@@ -44591,6 +44789,38 @@ function ChartDrawSVG()
44591
44789
 
44592
44790
  return false;
44593
44791
  }
44792
+
44793
+ this.ClickCell=function(x,y,e)
44794
+ {
44795
+ if (!this.IsShow) return null;
44796
+ if (!this.EnableClick) return null;
44797
+
44798
+ for(var i=this.TooltipRect.length-1; i>=0; --i)
44799
+ {
44800
+ var item=this.TooltipRect[i];
44801
+ if (!item.Rect) continue;
44802
+
44803
+ var rect=item.Rect;
44804
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
44805
+ {
44806
+ var svgItem=item.Item;
44807
+ var id=svgItem.ID;
44808
+ var result={ Data:svgItem, Redraw:false, ChartPaint:this };
44809
+ var oldSelectedID=null;
44810
+ var out={ };
44811
+ if (this.GetCacheData(IChartPainting.CACHE_KEY.SELECTED, out)) oldSelectedID=out.Data.ID;
44812
+ if (id!=oldSelectedID)
44813
+ {
44814
+ this.SaveCacheData(IChartPainting.CACHE_KEY.SELECTED, { ID:id } );
44815
+ result.Redraw=true;
44816
+ }
44817
+
44818
+ return result;
44819
+ }
44820
+ }
44821
+
44822
+ return null;
44823
+ }
44594
44824
  }
44595
44825
 
44596
44826
  // OX图 支持横屏
@@ -81260,6 +81490,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
81260
81490
  frame.Canvas=this.Canvas;
81261
81491
  frame.MainFrame=subFrame.Frame;
81262
81492
  frame.ChartBorder=subFrame.Frame.ChartBorder;
81493
+ frame.GlobalOption=this.GlobalOption;
81263
81494
  frame.GetEventCallback=(id)=> { return this.GetEventCallback(id); };
81264
81495
  if (obj.ShowRightText===true) frame.IsShow=true;
81265
81496
  else if (obj.ShowRightText===false) frame.IsShow=false;