@363045841yyt/klinechart-core 0.7.3 → 0.7.5-alpha.2
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.
- package/README.md +201 -201
- package/README.zh-CN.md +201 -201
- package/dist/engine/renderers/webgl/candleSurface.js +47 -47
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -2
- package/dist/version.js.map +1 -1
- package/package.json +129 -122
- package/src/__tests__/signal.test.ts +124 -124
- package/src/config/chartSettings.ts +66 -66
- package/src/controllers/__tests__/drawing.test.ts +214 -214
- package/src/controllers/__tests__/indicatorSelector.test.ts +481 -481
- package/src/controllers/__tests__/toolbar.test.ts +225 -225
- package/src/controllers/createChartController.ts +665 -665
- package/src/controllers/createDrawingController.ts +96 -96
- package/src/controllers/createIndicatorSelectorController.ts +307 -307
- package/src/controllers/createToolbarController.ts +146 -146
- package/src/controllers/index.ts +19 -19
- package/src/controllers/types.ts +284 -284
- package/src/engine/__tests__/chart.dpr.test.ts +401 -401
- package/src/engine/__tests__/paneRenderer.resize.test.ts +92 -92
- package/src/engine/chart-store.ts +121 -121
- package/src/engine/chart.d.ts +617 -617
- package/src/engine/chart.ts +2815 -2815
- package/src/engine/controller/__tests__/interaction.dpr.test.ts +259 -259
- package/src/engine/controller/interaction.ts +722 -722
- package/src/engine/controller/markerInteraction.ts +130 -130
- package/src/engine/controller/pinchTracker.ts +82 -82
- package/src/engine/controller/tooltipPosition.ts +48 -48
- package/src/engine/draw/__tests__/pixelAlign.spec.ts +176 -176
- package/src/engine/draw/pixelAlign.ts +259 -259
- package/src/engine/drawing/index.ts +655 -655
- package/src/engine/drawing/interaction.ts +842 -842
- package/src/engine/drawing/plugin.ts +343 -343
- package/src/engine/indicators/__tests__/__fixtures__/golden/atr.json +38 -38
- package/src/engine/indicators/__tests__/__fixtures__/golden/dema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/hma.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +55 -55
- package/src/engine/indicators/__tests__/__fixtures__/golden/kama.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/tema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/wma.json +40 -40
- package/src/engine/indicators/__tests__/__fixtures__/synthetic.ts +65 -65
- package/src/engine/indicators/__tests__/_propertyAssertions.ts +76 -76
- package/src/engine/indicators/__tests__/atr.test.ts +153 -153
- package/src/engine/indicators/__tests__/calculators.test.ts +614 -614
- package/src/engine/indicators/__tests__/cmf-mfi.test.ts +100 -100
- package/src/engine/indicators/__tests__/dema.test.ts +73 -73
- package/src/engine/indicators/__tests__/donchian.test.ts +70 -70
- package/src/engine/indicators/__tests__/hma.test.ts +73 -73
- package/src/engine/indicators/__tests__/ichimoku.test.ts +105 -105
- package/src/engine/indicators/__tests__/kama.test.ts +80 -80
- package/src/engine/indicators/__tests__/keltner.test.ts +65 -65
- package/src/engine/indicators/__tests__/pivot-fib.test.ts +110 -110
- package/src/engine/indicators/__tests__/roc.test.ts +68 -68
- package/src/engine/indicators/__tests__/sar.test.ts +86 -86
- package/src/engine/indicators/__tests__/scheduler.test.ts +831 -831
- package/src/engine/indicators/__tests__/soa.test.ts +533 -533
- package/src/engine/indicators/__tests__/structure.test.ts +110 -110
- package/src/engine/indicators/__tests__/supertrend.test.ts +65 -65
- package/src/engine/indicators/__tests__/tema.test.ts +68 -68
- package/src/engine/indicators/__tests__/trix.test.ts +70 -70
- package/src/engine/indicators/__tests__/volatility.test.ts +117 -117
- package/src/engine/indicators/__tests__/volume.test.ts +115 -115
- package/src/engine/indicators/__tests__/volumeProfile.test.ts +74 -74
- package/src/engine/indicators/__tests__/vwap.test.ts +69 -69
- package/src/engine/indicators/__tests__/wma.test.ts +112 -112
- package/src/engine/indicators/__tests__/zones.test.ts +95 -95
- package/src/engine/indicators/atrState.ts +27 -27
- package/src/engine/indicators/bollState.ts +51 -51
- package/src/engine/indicators/calculators.ts +2593 -2593
- package/src/engine/indicators/cciState.ts +25 -25
- package/src/engine/indicators/chaikinVolState.ts +32 -32
- package/src/engine/indicators/cmfState.ts +27 -27
- package/src/engine/indicators/demaState.ts +27 -27
- package/src/engine/indicators/donchianState.ts +43 -43
- package/src/engine/indicators/eneState.ts +43 -43
- package/src/engine/indicators/expmaState.ts +43 -43
- package/src/engine/indicators/fastkState.ts +25 -25
- package/src/engine/indicators/fibState.ts +41 -41
- package/src/engine/indicators/hmaState.ts +27 -27
- package/src/engine/indicators/hvState.ts +28 -28
- package/src/engine/indicators/ichimokuState.ts +70 -70
- package/src/engine/indicators/indicator.worker.ts +169 -169
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +62 -62
- package/src/engine/indicators/indicatorMetadata.ts +110 -110
- package/src/engine/indicators/indicatorRegistry.ts +106 -106
- package/src/engine/indicators/indicatorRuntime.ts +1548 -1548
- package/src/engine/indicators/kamaState.ts +34 -34
- package/src/engine/indicators/keltnerState.ts +49 -49
- package/src/engine/indicators/kstState.ts +42 -42
- package/src/engine/indicators/maState.ts +36 -36
- package/src/engine/indicators/macdState.ts +76 -76
- package/src/engine/indicators/mfiState.ts +27 -27
- package/src/engine/indicators/momState.ts +25 -25
- package/src/engine/indicators/obvState.ts +25 -25
- package/src/engine/indicators/parkinsonState.ts +28 -28
- package/src/engine/indicators/pivotState.ts +51 -51
- package/src/engine/indicators/pvtState.ts +25 -25
- package/src/engine/indicators/rocState.ts +27 -27
- package/src/engine/indicators/rsiState.ts +65 -65
- package/src/engine/indicators/sarState.ts +41 -41
- package/src/engine/indicators/scheduler.ts +1205 -1205
- package/src/engine/indicators/soa.ts +352 -352
- package/src/engine/indicators/stateComposer.ts +1262 -1262
- package/src/engine/indicators/stochState.ts +26 -26
- package/src/engine/indicators/structureState.ts +69 -69
- package/src/engine/indicators/supertrendState.ts +37 -37
- package/src/engine/indicators/temaState.ts +27 -27
- package/src/engine/indicators/trixState.ts +35 -35
- package/src/engine/indicators/vmaState.ts +27 -27
- package/src/engine/indicators/volumeProfileState.ts +63 -63
- package/src/engine/indicators/vwapState.ts +29 -29
- package/src/engine/indicators/wmaState.ts +27 -27
- package/src/engine/indicators/wmsrState.ts +25 -25
- package/src/engine/indicators/workerProtocol.ts +613 -613
- package/src/engine/indicators/zonesState.ts +47 -47
- package/src/engine/layout/pane.ts +161 -161
- package/src/engine/marker/registry.ts +265 -265
- package/src/engine/paneRenderer.ts +169 -169
- package/src/engine/renderers/Indicator/atr.ts +237 -237
- package/src/engine/renderers/Indicator/boll.ts +317 -317
- package/src/engine/renderers/Indicator/cci.ts +275 -275
- package/src/engine/renderers/Indicator/chaikinVol.ts +138 -138
- package/src/engine/renderers/Indicator/cmf.ts +137 -137
- package/src/engine/renderers/Indicator/dema.ts +136 -136
- package/src/engine/renderers/Indicator/donchian.ts +137 -137
- package/src/engine/renderers/Indicator/ene.ts +271 -271
- package/src/engine/renderers/Indicator/expma.ts +197 -197
- package/src/engine/renderers/Indicator/fastk.ts +316 -316
- package/src/engine/renderers/Indicator/fib.ts +141 -141
- package/src/engine/renderers/Indicator/hma.ts +136 -136
- package/src/engine/renderers/Indicator/hv.ts +124 -124
- package/src/engine/renderers/Indicator/ichimoku.ts +181 -181
- package/src/engine/renderers/Indicator/index.ts +241 -241
- package/src/engine/renderers/Indicator/indicatorData.ts +650 -650
- package/src/engine/renderers/Indicator/kama.ts +136 -136
- package/src/engine/renderers/Indicator/keltner.ts +137 -137
- package/src/engine/renderers/Indicator/kst.ts +302 -302
- package/src/engine/renderers/Indicator/ma.ts +200 -200
- package/src/engine/renderers/Indicator/macd.ts +477 -477
- package/src/engine/renderers/Indicator/macdLegend.ts +141 -141
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +272 -272
- package/src/engine/renderers/Indicator/mfi.ts +142 -142
- package/src/engine/renderers/Indicator/mom.ts +311 -311
- package/src/engine/renderers/Indicator/obv.ts +123 -123
- package/src/engine/renderers/Indicator/parkinson.ts +124 -124
- package/src/engine/renderers/Indicator/pivot.ts +131 -131
- package/src/engine/renderers/Indicator/pvt.ts +123 -123
- package/src/engine/renderers/Indicator/roc.ts +143 -143
- package/src/engine/renderers/Indicator/rsi.ts +390 -390
- package/src/engine/renderers/Indicator/sar.ts +113 -113
- package/src/engine/renderers/Indicator/scale/atr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/cci_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/fastk_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/indicator_scale.ts +204 -204
- package/src/engine/renderers/Indicator/scale/kst_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/macd_scale.ts +22 -22
- package/src/engine/renderers/Indicator/scale/mom_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/rsi_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/stoch_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/volume_scale.ts +26 -26
- package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/stoch.ts +359 -359
- package/src/engine/renderers/Indicator/structure.ts +126 -126
- package/src/engine/renderers/Indicator/subPaneConfig.ts +265 -265
- package/src/engine/renderers/Indicator/supertrend.ts +115 -115
- package/src/engine/renderers/Indicator/tema.ts +136 -136
- package/src/engine/renderers/Indicator/trix.ts +158 -158
- package/src/engine/renderers/Indicator/vma.ts +124 -124
- package/src/engine/renderers/Indicator/volumeProfile.ts +125 -125
- package/src/engine/renderers/Indicator/vwap.ts +123 -123
- package/src/engine/renderers/Indicator/wma.ts +136 -136
- package/src/engine/renderers/Indicator/wmsr.ts +328 -328
- package/src/engine/renderers/Indicator/zones.ts +104 -104
- package/src/engine/renderers/__tests__/boll.renderer.test.ts +314 -314
- package/src/engine/renderers/__tests__/ene.renderer.test.ts +305 -305
- package/src/engine/renderers/__tests__/expma.renderer.test.ts +279 -279
- package/src/engine/renderers/__tests__/ma.renderer.test.ts +426 -426
- package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +502 -502
- package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +173 -173
- package/src/engine/renderers/candle.ts +459 -459
- package/src/engine/renderers/crosshair.ts +69 -69
- package/src/engine/renderers/customMarkers.ts +162 -162
- package/src/engine/renderers/extremaMarkers.ts +246 -246
- package/src/engine/renderers/gridLines.ts +90 -90
- package/src/engine/renderers/lastPrice.ts +97 -97
- package/src/engine/renderers/paneTitle.ts +136 -136
- package/src/engine/renderers/subVolume.ts +236 -236
- package/src/engine/renderers/timeAxis.ts +121 -121
- package/src/engine/renderers/webgl/candleSurface.ts +955 -955
- package/src/engine/renderers/webgl/sharedWebGLSurface.ts +146 -146
- package/src/engine/renderers/yAxis.ts +105 -105
- package/src/engine/scale/__tests__/logFormula.spec.ts +148 -148
- package/src/engine/scale/logFormula.ts +130 -130
- package/src/engine/scale/price.ts +39 -39
- package/src/engine/scale/priceScale.ts +264 -264
- package/src/engine/subPaneManager.ts +427 -427
- package/src/engine/theme/colors.ts +642 -642
- package/src/engine/theme/fonts.ts +20 -20
- package/src/engine/utils/klineConfig.ts +49 -49
- package/src/engine/utils/tickCount.ts +11 -11
- package/src/engine/utils/tickPosition.ts +214 -214
- package/src/engine/utils/zoom.ts +83 -83
- package/src/engine/viewport/viewport.ts +67 -67
- package/src/index.ts +3 -3
- package/src/plugin/ConfigManager.ts +93 -93
- package/src/plugin/EventBus.ts +77 -77
- package/src/plugin/HookSystem.ts +106 -106
- package/src/plugin/PluginHost.ts +243 -243
- package/src/plugin/PluginRegistry.ts +92 -92
- package/src/plugin/StateStore.ts +73 -73
- package/src/plugin/index.ts +19 -19
- package/src/plugin/rendererPluginManager.ts +368 -368
- package/src/plugin/stateKeys.ts +8 -8
- package/src/plugin/types.ts +526 -526
- package/src/reactivity/index.ts +2 -2
- package/src/reactivity/signal.ts +119 -119
- package/src/semantic/controller.ts +251 -251
- package/src/semantic/drawShape.ts +260 -260
- package/src/semantic/index.ts +28 -28
- package/src/semantic/schema.json +256 -256
- package/src/semantic/types.ts +251 -251
- package/src/semantic/validator.ts +349 -349
- package/src/types/kLine.ts +13 -13
- package/src/types/price.ts +56 -56
- package/src/types/volumePrice.ts +33 -33
- package/src/utils/dateFormat.ts +208 -208
- package/src/utils/kLineDraw/axis.ts +562 -562
- package/src/utils/priceToY.ts +34 -34
- package/src/utils/volumePrice.ts +202 -202
- package/src/version.ts +1 -1
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { Pane } from '@/core/layout/pane'
|
|
3
|
-
import { PaneRenderer } from '@/core/paneRenderer'
|
|
4
|
-
import { SharedWebGLSurface } from '@/core/renderers/webgl/sharedWebGLSurface'
|
|
5
|
-
|
|
6
|
-
describe('PaneRenderer resize DPR mapping', () => {
|
|
7
|
-
it('maps logical plot size to physical canvas size and keeps CSS size logical', () => {
|
|
8
|
-
const mainCanvas = document.createElement('canvas')
|
|
9
|
-
const overlayCanvas = document.createElement('canvas')
|
|
10
|
-
const yAxisCanvas = document.createElement('canvas')
|
|
11
|
-
const pane = new Pane('main')
|
|
12
|
-
const sharedWebGLSurface = new SharedWebGLSurface()
|
|
13
|
-
const renderer = new PaneRenderer(
|
|
14
|
-
{ mainCanvas, overlayCanvas, yAxisCanvas },
|
|
15
|
-
pane,
|
|
16
|
-
{
|
|
17
|
-
rightAxisWidth: 80,
|
|
18
|
-
yPaddingPx: 0,
|
|
19
|
-
priceLabelWidth: 60,
|
|
20
|
-
},
|
|
21
|
-
sharedWebGLSurface,
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
renderer.resize(500, 240, 2)
|
|
25
|
-
|
|
26
|
-
expect(mainCanvas.width).toBe(Math.round(500 * 2))
|
|
27
|
-
expect(mainCanvas.height).toBe(Math.round(240 * 2))
|
|
28
|
-
expect(mainCanvas.style.width).toBe('500px')
|
|
29
|
-
expect(mainCanvas.style.height).toBe('240px')
|
|
30
|
-
// overlayCanvas should match mainCanvas
|
|
31
|
-
expect(overlayCanvas.width).toBe(mainCanvas.width)
|
|
32
|
-
expect(overlayCanvas.height).toBe(mainCanvas.height)
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('uses (rightAxisWidth + priceLabelWidth) for yAxis physical width when no parent width is available', () => {
|
|
36
|
-
const mainCanvas = document.createElement('canvas')
|
|
37
|
-
const overlayCanvas = document.createElement('canvas')
|
|
38
|
-
const yAxisCanvas = document.createElement('canvas')
|
|
39
|
-
const pane = new Pane('main')
|
|
40
|
-
const sharedWebGLSurface = new SharedWebGLSurface()
|
|
41
|
-
const renderer = new PaneRenderer(
|
|
42
|
-
{ mainCanvas, overlayCanvas, yAxisCanvas },
|
|
43
|
-
pane,
|
|
44
|
-
{
|
|
45
|
-
rightAxisWidth: 100,
|
|
46
|
-
yPaddingPx: 0,
|
|
47
|
-
priceLabelWidth: 70,
|
|
48
|
-
},
|
|
49
|
-
sharedWebGLSurface,
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
renderer.resize(500, 200, 1.5)
|
|
53
|
-
|
|
54
|
-
expect(yAxisCanvas.width).toBe(Math.round((100 + 70) * 1.5))
|
|
55
|
-
expect(yAxisCanvas.height).toBe(Math.round(200 * 1.5))
|
|
56
|
-
expect(yAxisCanvas.style.width).toBe('170px')
|
|
57
|
-
expect(yAxisCanvas.style.height).toBe('200px')
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('uses parent clientWidth for yAxis canvas width when available', () => {
|
|
61
|
-
const host = document.createElement('div')
|
|
62
|
-
Object.defineProperty(host, 'clientWidth', {
|
|
63
|
-
value: 168,
|
|
64
|
-
configurable: true,
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
const mainCanvas = document.createElement('canvas')
|
|
68
|
-
const overlayCanvas = document.createElement('canvas')
|
|
69
|
-
const yAxisCanvas = document.createElement('canvas')
|
|
70
|
-
host.appendChild(yAxisCanvas)
|
|
71
|
-
|
|
72
|
-
const pane = new Pane('main')
|
|
73
|
-
const sharedWebGLSurface = new SharedWebGLSurface()
|
|
74
|
-
const renderer = new PaneRenderer(
|
|
75
|
-
{ mainCanvas, overlayCanvas, yAxisCanvas },
|
|
76
|
-
pane,
|
|
77
|
-
{
|
|
78
|
-
rightAxisWidth: 100,
|
|
79
|
-
yPaddingPx: 0,
|
|
80
|
-
priceLabelWidth: 70,
|
|
81
|
-
},
|
|
82
|
-
sharedWebGLSurface,
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
renderer.resize(500, 200, 1.5)
|
|
86
|
-
|
|
87
|
-
expect(yAxisCanvas.width).toBe(Math.round(168 * 1.5))
|
|
88
|
-
expect(yAxisCanvas.height).toBe(Math.round(200 * 1.5))
|
|
89
|
-
expect(yAxisCanvas.style.width).toBe('168px')
|
|
90
|
-
expect(yAxisCanvas.style.height).toBe('200px')
|
|
91
|
-
})
|
|
92
|
-
})
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { Pane } from '@/core/layout/pane'
|
|
3
|
+
import { PaneRenderer } from '@/core/paneRenderer'
|
|
4
|
+
import { SharedWebGLSurface } from '@/core/renderers/webgl/sharedWebGLSurface'
|
|
5
|
+
|
|
6
|
+
describe('PaneRenderer resize DPR mapping', () => {
|
|
7
|
+
it('maps logical plot size to physical canvas size and keeps CSS size logical', () => {
|
|
8
|
+
const mainCanvas = document.createElement('canvas')
|
|
9
|
+
const overlayCanvas = document.createElement('canvas')
|
|
10
|
+
const yAxisCanvas = document.createElement('canvas')
|
|
11
|
+
const pane = new Pane('main')
|
|
12
|
+
const sharedWebGLSurface = new SharedWebGLSurface()
|
|
13
|
+
const renderer = new PaneRenderer(
|
|
14
|
+
{ mainCanvas, overlayCanvas, yAxisCanvas },
|
|
15
|
+
pane,
|
|
16
|
+
{
|
|
17
|
+
rightAxisWidth: 80,
|
|
18
|
+
yPaddingPx: 0,
|
|
19
|
+
priceLabelWidth: 60,
|
|
20
|
+
},
|
|
21
|
+
sharedWebGLSurface,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
renderer.resize(500, 240, 2)
|
|
25
|
+
|
|
26
|
+
expect(mainCanvas.width).toBe(Math.round(500 * 2))
|
|
27
|
+
expect(mainCanvas.height).toBe(Math.round(240 * 2))
|
|
28
|
+
expect(mainCanvas.style.width).toBe('500px')
|
|
29
|
+
expect(mainCanvas.style.height).toBe('240px')
|
|
30
|
+
// overlayCanvas should match mainCanvas
|
|
31
|
+
expect(overlayCanvas.width).toBe(mainCanvas.width)
|
|
32
|
+
expect(overlayCanvas.height).toBe(mainCanvas.height)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('uses (rightAxisWidth + priceLabelWidth) for yAxis physical width when no parent width is available', () => {
|
|
36
|
+
const mainCanvas = document.createElement('canvas')
|
|
37
|
+
const overlayCanvas = document.createElement('canvas')
|
|
38
|
+
const yAxisCanvas = document.createElement('canvas')
|
|
39
|
+
const pane = new Pane('main')
|
|
40
|
+
const sharedWebGLSurface = new SharedWebGLSurface()
|
|
41
|
+
const renderer = new PaneRenderer(
|
|
42
|
+
{ mainCanvas, overlayCanvas, yAxisCanvas },
|
|
43
|
+
pane,
|
|
44
|
+
{
|
|
45
|
+
rightAxisWidth: 100,
|
|
46
|
+
yPaddingPx: 0,
|
|
47
|
+
priceLabelWidth: 70,
|
|
48
|
+
},
|
|
49
|
+
sharedWebGLSurface,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
renderer.resize(500, 200, 1.5)
|
|
53
|
+
|
|
54
|
+
expect(yAxisCanvas.width).toBe(Math.round((100 + 70) * 1.5))
|
|
55
|
+
expect(yAxisCanvas.height).toBe(Math.round(200 * 1.5))
|
|
56
|
+
expect(yAxisCanvas.style.width).toBe('170px')
|
|
57
|
+
expect(yAxisCanvas.style.height).toBe('200px')
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it('uses parent clientWidth for yAxis canvas width when available', () => {
|
|
61
|
+
const host = document.createElement('div')
|
|
62
|
+
Object.defineProperty(host, 'clientWidth', {
|
|
63
|
+
value: 168,
|
|
64
|
+
configurable: true,
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
const mainCanvas = document.createElement('canvas')
|
|
68
|
+
const overlayCanvas = document.createElement('canvas')
|
|
69
|
+
const yAxisCanvas = document.createElement('canvas')
|
|
70
|
+
host.appendChild(yAxisCanvas)
|
|
71
|
+
|
|
72
|
+
const pane = new Pane('main')
|
|
73
|
+
const sharedWebGLSurface = new SharedWebGLSurface()
|
|
74
|
+
const renderer = new PaneRenderer(
|
|
75
|
+
{ mainCanvas, overlayCanvas, yAxisCanvas },
|
|
76
|
+
pane,
|
|
77
|
+
{
|
|
78
|
+
rightAxisWidth: 100,
|
|
79
|
+
yPaddingPx: 0,
|
|
80
|
+
priceLabelWidth: 70,
|
|
81
|
+
},
|
|
82
|
+
sharedWebGLSurface,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
renderer.resize(500, 200, 1.5)
|
|
86
|
+
|
|
87
|
+
expect(yAxisCanvas.width).toBe(Math.round(168 * 1.5))
|
|
88
|
+
expect(yAxisCanvas.height).toBe(Math.round(200 * 1.5))
|
|
89
|
+
expect(yAxisCanvas.style.width).toBe('168px')
|
|
90
|
+
expect(yAxisCanvas.style.height).toBe('200px')
|
|
91
|
+
})
|
|
92
|
+
})
|
|
@@ -1,121 +1,121 @@
|
|
|
1
|
-
import { reactive, computed, type UnwrapNestedRefs } from 'vue'
|
|
2
|
-
import { getPhysicalKLineConfig } from './utils/klineConfig'
|
|
3
|
-
import type { DrawingObject } from '../plugin'
|
|
4
|
-
|
|
5
|
-
/** 右侧空白绘制槽位数(逻辑 bar 数) */
|
|
6
|
-
export const TRAILING_DRAWING_SLOTS = 24
|
|
7
|
-
|
|
8
|
-
export interface ChartStoreOptions {
|
|
9
|
-
initialZoomLevel: number
|
|
10
|
-
minKWidth: number
|
|
11
|
-
maxKWidth: number
|
|
12
|
-
zoomLevels: number
|
|
13
|
-
rightAxisWidth: number
|
|
14
|
-
priceLabelWidth: number
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function computeContentWidth(params: {
|
|
18
|
-
dataLength: number
|
|
19
|
-
kWidth: number
|
|
20
|
-
kGap: number
|
|
21
|
-
viewWidth: number
|
|
22
|
-
viewportDpr: number
|
|
23
|
-
}): number {
|
|
24
|
-
const { dataLength, kWidth, kGap, viewWidth, viewportDpr } = params
|
|
25
|
-
if (dataLength === 0) return 0
|
|
26
|
-
const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, viewportDpr)
|
|
27
|
-
const dataPlotWidth = (startXPx + (dataLength + TRAILING_DRAWING_SLOTS) * unitPx) / viewportDpr
|
|
28
|
-
return Math.max(dataPlotWidth, viewWidth)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function createChartStore(opts: ChartStoreOptions) {
|
|
32
|
-
const state = reactive({
|
|
33
|
-
zoomLevel: opts.initialZoomLevel,
|
|
34
|
-
kWidth: 0,
|
|
35
|
-
kGap: 1,
|
|
36
|
-
viewportDpr: 1,
|
|
37
|
-
dataLength: 0,
|
|
38
|
-
dataVersion: 0,
|
|
39
|
-
paneRatios: {} as Record<string, number>,
|
|
40
|
-
drawings: [] as DrawingObject[],
|
|
41
|
-
selectedDrawingId: null as string | null,
|
|
42
|
-
drawingVersion: 0,
|
|
43
|
-
viewWidth: 0,
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
// 右侧轴宽度
|
|
47
|
-
const axisHostWidth = computed(() => opts.rightAxisWidth + opts.priceLabelWidth)
|
|
48
|
-
|
|
49
|
-
const totalWidth = computed(() =>
|
|
50
|
-
computeContentWidth({
|
|
51
|
-
dataLength: state.dataLength,
|
|
52
|
-
kWidth: state.kWidth,
|
|
53
|
-
kGap: state.kGap,
|
|
54
|
-
viewWidth: state.viewWidth,
|
|
55
|
-
viewportDpr: state.viewportDpr,
|
|
56
|
-
}),
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
function bumpDataVersion() {
|
|
60
|
-
state.dataVersion++
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function bumpDrawingVersion() {
|
|
64
|
-
state.drawingVersion++
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function setDataLength(length: number) {
|
|
68
|
-
state.dataLength = length
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function setViewportDpr(dpr: number) {
|
|
72
|
-
state.viewportDpr = dpr
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function setViewWidth(width: number) {
|
|
76
|
-
state.viewWidth = width
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function setZoomState(level: number, newKWidth: number, newKGap: number) {
|
|
80
|
-
state.zoomLevel = level
|
|
81
|
-
state.kWidth = newKWidth
|
|
82
|
-
state.kGap = newKGap
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function setPaneRatios(ratios: Record<string, number>) {
|
|
86
|
-
state.paneRatios = ratios
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function setDrawings(newDrawings: DrawingObject[]) {
|
|
90
|
-
state.drawings = newDrawings
|
|
91
|
-
if (state.selectedDrawingId && !newDrawings.some((d) => d.id === state.selectedDrawingId)) {
|
|
92
|
-
state.selectedDrawingId = null
|
|
93
|
-
}
|
|
94
|
-
state.drawingVersion++
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function setSelectedDrawingId(id: string | null) {
|
|
98
|
-
state.selectedDrawingId = id
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
state: state as UnwrapNestedRefs<typeof state>,
|
|
103
|
-
computed: {
|
|
104
|
-
axisHostWidth,
|
|
105
|
-
totalWidth,
|
|
106
|
-
},
|
|
107
|
-
actions: {
|
|
108
|
-
bumpDataVersion,
|
|
109
|
-
bumpDrawingVersion,
|
|
110
|
-
setDataLength,
|
|
111
|
-
setViewportDpr,
|
|
112
|
-
setViewWidth,
|
|
113
|
-
setZoomState,
|
|
114
|
-
setPaneRatios,
|
|
115
|
-
setDrawings,
|
|
116
|
-
setSelectedDrawingId,
|
|
117
|
-
},
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export type ChartStore = ReturnType<typeof createChartStore>
|
|
1
|
+
import { reactive, computed, type UnwrapNestedRefs } from 'vue'
|
|
2
|
+
import { getPhysicalKLineConfig } from './utils/klineConfig'
|
|
3
|
+
import type { DrawingObject } from '../plugin'
|
|
4
|
+
|
|
5
|
+
/** 右侧空白绘制槽位数(逻辑 bar 数) */
|
|
6
|
+
export const TRAILING_DRAWING_SLOTS = 24
|
|
7
|
+
|
|
8
|
+
export interface ChartStoreOptions {
|
|
9
|
+
initialZoomLevel: number
|
|
10
|
+
minKWidth: number
|
|
11
|
+
maxKWidth: number
|
|
12
|
+
zoomLevels: number
|
|
13
|
+
rightAxisWidth: number
|
|
14
|
+
priceLabelWidth: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function computeContentWidth(params: {
|
|
18
|
+
dataLength: number
|
|
19
|
+
kWidth: number
|
|
20
|
+
kGap: number
|
|
21
|
+
viewWidth: number
|
|
22
|
+
viewportDpr: number
|
|
23
|
+
}): number {
|
|
24
|
+
const { dataLength, kWidth, kGap, viewWidth, viewportDpr } = params
|
|
25
|
+
if (dataLength === 0) return 0
|
|
26
|
+
const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, viewportDpr)
|
|
27
|
+
const dataPlotWidth = (startXPx + (dataLength + TRAILING_DRAWING_SLOTS) * unitPx) / viewportDpr
|
|
28
|
+
return Math.max(dataPlotWidth, viewWidth)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function createChartStore(opts: ChartStoreOptions) {
|
|
32
|
+
const state = reactive({
|
|
33
|
+
zoomLevel: opts.initialZoomLevel,
|
|
34
|
+
kWidth: 0,
|
|
35
|
+
kGap: 1,
|
|
36
|
+
viewportDpr: 1,
|
|
37
|
+
dataLength: 0,
|
|
38
|
+
dataVersion: 0,
|
|
39
|
+
paneRatios: {} as Record<string, number>,
|
|
40
|
+
drawings: [] as DrawingObject[],
|
|
41
|
+
selectedDrawingId: null as string | null,
|
|
42
|
+
drawingVersion: 0,
|
|
43
|
+
viewWidth: 0,
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// 右侧轴宽度
|
|
47
|
+
const axisHostWidth = computed(() => opts.rightAxisWidth + opts.priceLabelWidth)
|
|
48
|
+
|
|
49
|
+
const totalWidth = computed(() =>
|
|
50
|
+
computeContentWidth({
|
|
51
|
+
dataLength: state.dataLength,
|
|
52
|
+
kWidth: state.kWidth,
|
|
53
|
+
kGap: state.kGap,
|
|
54
|
+
viewWidth: state.viewWidth,
|
|
55
|
+
viewportDpr: state.viewportDpr,
|
|
56
|
+
}),
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
function bumpDataVersion() {
|
|
60
|
+
state.dataVersion++
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function bumpDrawingVersion() {
|
|
64
|
+
state.drawingVersion++
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function setDataLength(length: number) {
|
|
68
|
+
state.dataLength = length
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function setViewportDpr(dpr: number) {
|
|
72
|
+
state.viewportDpr = dpr
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function setViewWidth(width: number) {
|
|
76
|
+
state.viewWidth = width
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function setZoomState(level: number, newKWidth: number, newKGap: number) {
|
|
80
|
+
state.zoomLevel = level
|
|
81
|
+
state.kWidth = newKWidth
|
|
82
|
+
state.kGap = newKGap
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function setPaneRatios(ratios: Record<string, number>) {
|
|
86
|
+
state.paneRatios = ratios
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function setDrawings(newDrawings: DrawingObject[]) {
|
|
90
|
+
state.drawings = newDrawings
|
|
91
|
+
if (state.selectedDrawingId && !newDrawings.some((d) => d.id === state.selectedDrawingId)) {
|
|
92
|
+
state.selectedDrawingId = null
|
|
93
|
+
}
|
|
94
|
+
state.drawingVersion++
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function setSelectedDrawingId(id: string | null) {
|
|
98
|
+
state.selectedDrawingId = id
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
state: state as UnwrapNestedRefs<typeof state>,
|
|
103
|
+
computed: {
|
|
104
|
+
axisHostWidth,
|
|
105
|
+
totalWidth,
|
|
106
|
+
},
|
|
107
|
+
actions: {
|
|
108
|
+
bumpDataVersion,
|
|
109
|
+
bumpDrawingVersion,
|
|
110
|
+
setDataLength,
|
|
111
|
+
setViewportDpr,
|
|
112
|
+
setViewWidth,
|
|
113
|
+
setZoomState,
|
|
114
|
+
setPaneRatios,
|
|
115
|
+
setDrawings,
|
|
116
|
+
setSelectedDrawingId,
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export type ChartStore = ReturnType<typeof createChartStore>
|