@363045841yyt/klinechart-core 0.8.1-alpha.4 → 0.8.1
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/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +21 -1
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +6 -1
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +3 -3
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.d.ts +5 -1
- package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.js +82 -48
- package/dist/data-fetchers/dataBuffer.js.map +1 -1
- package/dist/data-fetchers/tradingview.d.ts.map +1 -1
- package/dist/data-fetchers/tradingview.js +4 -5
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/engine/chart.d.ts +29 -367
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +239 -1842
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/chartContext.d.ts +24 -0
- package/dist/engine/chartContext.d.ts.map +1 -0
- package/dist/engine/chartContext.js +19 -0
- package/dist/engine/chartContext.js.map +1 -0
- package/dist/engine/chartTypes.d.ts +77 -0
- package/dist/engine/chartTypes.d.ts.map +1 -0
- package/dist/engine/chartTypes.js +2 -0
- package/dist/engine/chartTypes.js.map +1 -0
- package/dist/engine/data/chartDataManager.d.ts +102 -0
- package/dist/engine/data/chartDataManager.d.ts.map +1 -0
- package/dist/engine/data/chartDataManager.js +590 -0
- package/dist/engine/data/chartDataManager.js.map +1 -0
- package/dist/engine/indicators/chartIndicatorManager.d.ts +102 -0
- package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -0
- package/dist/engine/indicators/chartIndicatorManager.js +437 -0
- package/dist/engine/indicators/chartIndicatorManager.js.map +1 -0
- package/dist/engine/layout/chartPaneLayout.d.ts +53 -0
- package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -0
- package/dist/engine/layout/chartPaneLayout.js +388 -0
- package/dist/engine/layout/chartPaneLayout.js.map +1 -0
- package/dist/engine/render/chartRenderer.d.ts +86 -0
- package/dist/engine/render/chartRenderer.d.ts.map +1 -0
- package/dist/engine/render/chartRenderer.js +438 -0
- package/dist/engine/render/chartRenderer.js.map +1 -0
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +73 -7
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
- package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
- package/dist/engine/renderers/comparisonLine.js +25 -11
- package/dist/engine/renderers/comparisonLine.js.map +1 -1
- package/dist/engine/subPaneManager.d.ts +27 -6
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +54 -56
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/engine/utils/chartZoomController.d.ts +33 -0
- package/dist/engine/utils/chartZoomController.d.ts.map +1 -0
- package/dist/engine/utils/chartZoomController.js +66 -0
- package/dist/engine/utils/chartZoomController.js.map +1 -0
- package/dist/engine/viewport/chartViewportManager.d.ts +72 -0
- package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -0
- package/dist/engine/viewport/chartViewportManager.js +249 -0
- package/dist/engine/viewport/chartViewportManager.js.map +1 -0
- package/dist/plugin/types.d.ts +1 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/types.js.map +1 -1
- package/dist/tokens/theme-china.d.ts.map +1 -1
- package/dist/tokens/theme-china.js +0 -4
- package/dist/tokens/theme-china.js.map +1 -1
- package/dist/tokens/theme-dark.d.ts.map +1 -1
- package/dist/tokens/theme-dark.js +0 -4
- package/dist/tokens/theme-dark.js.map +1 -1
- package/dist/tokens/theme-light.d.ts.map +1 -1
- package/dist/tokens/theme-light.js +1 -5
- package/dist/tokens/theme-light.js.map +1 -1
- package/dist/tokens/types.d.ts +0 -4
- package/dist/tokens/types.d.ts.map +1 -1
- package/dist/types/price.d.ts +2 -0
- package/dist/types/price.d.ts.map +1 -1
- package/dist/types/price.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/controllers/createChartController.ts +39 -10
- package/src/controllers/types.ts +6 -1
- package/src/data-fetchers/baostock.ts +3 -3
- package/src/data-fetchers/dataBuffer.ts +64 -23
- package/src/data-fetchers/tradingview.ts +4 -5
- package/src/engine/__tests__/subPaneManager.test.ts +154 -0
- package/src/engine/chart.ts +252 -2250
- package/src/engine/chartContext.ts +34 -0
- package/src/engine/chartTypes.ts +88 -0
- package/src/engine/data/chartDataManager.ts +691 -0
- package/src/engine/indicators/__tests__/chartIndicatorManager.test.ts +103 -0
- package/src/engine/indicators/chartIndicatorManager.ts +566 -0
- package/src/engine/layout/chartPaneLayout.ts +474 -0
- package/src/engine/render/chartRenderer.ts +579 -0
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +99 -13
- package/src/engine/renderers/comparisonLine.ts +25 -11
- package/src/engine/subPaneManager.ts +75 -59
- package/src/engine/utils/chartZoomController.ts +104 -0
- package/src/engine/viewport/chartViewportManager.ts +310 -0
- package/src/plugin/types.ts +1 -0
- package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +1 -9
- package/src/tokens/theme-china.ts +0 -4
- package/src/tokens/theme-dark.ts +0 -4
- package/src/tokens/theme-light.ts +2 -6
- package/src/tokens/types.ts +0 -4
- package/src/types/price.ts +2 -0
- package/src/version.ts +1 -1
- package/src/engine/chart.d.ts +0 -626
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RENDERER_PRIORITY } from '../../plugin';
|
|
2
|
-
const
|
|
2
|
+
const DEFAULT_COMPARISON_COLOR = '#f59e0b';
|
|
3
3
|
export function createComparisonLineRenderer() {
|
|
4
4
|
return {
|
|
5
5
|
name: 'comparisonLine',
|
|
@@ -17,10 +17,11 @@ export function createComparisonLineRenderer() {
|
|
|
17
17
|
if (context.pane.id !== 'main')
|
|
18
18
|
return;
|
|
19
19
|
const baseIndex = Math.max(0, context.range.start);
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
if (!Number.isFinite(mainBase) || mainBase <= 0 || baseTimestamp === undefined)
|
|
20
|
+
const baseItem = mainData[baseIndex];
|
|
21
|
+
if (!baseItem || !Number.isFinite(baseItem.close) || baseItem.close <= 0)
|
|
23
22
|
return;
|
|
23
|
+
const mainBase = baseItem.close;
|
|
24
|
+
const baseDate = baseItem.date ?? '';
|
|
24
25
|
const ctx = context.ctx;
|
|
25
26
|
ctx.save();
|
|
26
27
|
ctx.translate(-context.scrollLeft, 0);
|
|
@@ -30,14 +31,19 @@ export function createComparisonLineRenderer() {
|
|
|
30
31
|
const data = comparisonData.get(spec.symbol);
|
|
31
32
|
if (!data?.length)
|
|
32
33
|
continue;
|
|
33
|
-
const baseline =
|
|
34
|
+
const baseline = baseDate ? findBaselineByDate(data, baseDate) : findBaselineByTimestamp(data, baseItem.timestamp);
|
|
34
35
|
if (!baseline || baseline.close <= 0)
|
|
35
36
|
continue;
|
|
36
|
-
const
|
|
37
|
-
for (const item of data)
|
|
38
|
-
|
|
37
|
+
const byDate = new Map();
|
|
38
|
+
for (const item of data) {
|
|
39
|
+
if (item.date)
|
|
40
|
+
byDate.set(item.date, item);
|
|
41
|
+
else
|
|
42
|
+
byDate.set(String(item.timestamp), item);
|
|
43
|
+
}
|
|
44
|
+
const colors = context.comparisonColors;
|
|
39
45
|
ctx.beginPath();
|
|
40
|
-
ctx.strokeStyle =
|
|
46
|
+
ctx.strokeStyle = colors?.get(spec.symbol) ?? DEFAULT_COMPARISON_COLOR;
|
|
41
47
|
let hasPath = false;
|
|
42
48
|
let previousHadPoint = false;
|
|
43
49
|
for (let i = context.range.start; i < context.range.end && i < mainData.length; i++) {
|
|
@@ -46,7 +52,8 @@ export function createComparisonLineRenderer() {
|
|
|
46
52
|
previousHadPoint = false;
|
|
47
53
|
continue;
|
|
48
54
|
}
|
|
49
|
-
const
|
|
55
|
+
const key = mainItem.date ?? String(mainItem.timestamp);
|
|
56
|
+
const item = byDate.get(key);
|
|
50
57
|
const x = context.kLineCenters[i - context.range.start];
|
|
51
58
|
if (!item || x === undefined || !Number.isFinite(item.close)) {
|
|
52
59
|
previousHadPoint = false;
|
|
@@ -73,7 +80,14 @@ export function createComparisonLineRenderer() {
|
|
|
73
80
|
},
|
|
74
81
|
};
|
|
75
82
|
}
|
|
76
|
-
function
|
|
83
|
+
function findBaselineByDate(data, date) {
|
|
84
|
+
for (const item of data) {
|
|
85
|
+
if (item.date && item.date >= date)
|
|
86
|
+
return item;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
function findBaselineByTimestamp(data, timestamp) {
|
|
77
91
|
for (const item of data) {
|
|
78
92
|
if (item.timestamp >= timestamp)
|
|
79
93
|
return item;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comparisonLine.js","sourceRoot":"","sources":["../../../src/engine/renderers/comparisonLine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGhD,MAAM,
|
|
1
|
+
{"version":3,"file":"comparisonLine.js","sourceRoot":"","sources":["../../../src/engine/renderers/comparisonLine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import type { Chart } from './chart';
|
|
2
1
|
import type { SubIndicatorType } from './renderers/Indicator';
|
|
3
2
|
import { type Signal } from '../reactivity/signal';
|
|
3
|
+
import type { IndicatorScheduler } from './indicators/scheduler';
|
|
4
|
+
import type { RendererPlugin, RendererPluginWithHost } from '../plugin';
|
|
5
|
+
import type { PaneSpec } from './chartTypes';
|
|
4
6
|
export interface SubPaneEntry {
|
|
5
7
|
paneId: string;
|
|
6
8
|
indicatorId: SubIndicatorType;
|
|
@@ -9,20 +11,39 @@ export interface SubPaneEntry {
|
|
|
9
11
|
scaleRendererName: string;
|
|
10
12
|
paneTitleRendererName: string;
|
|
11
13
|
}
|
|
14
|
+
export interface SubPaneContext {
|
|
15
|
+
getIndicatorScheduler: () => IndicatorScheduler;
|
|
16
|
+
hasPane: (paneId: string) => boolean;
|
|
17
|
+
upsertPane: (def: PaneSpec) => void;
|
|
18
|
+
getRenderer: <T extends RendererPlugin = RendererPlugin>(name: string) => T | undefined;
|
|
19
|
+
useRenderer: (plugin: RendererPlugin | RendererPluginWithHost, config?: Record<string, unknown>) => void;
|
|
20
|
+
removeRenderer: (name: string) => void;
|
|
21
|
+
removePaneDefinition: (paneId: string) => void;
|
|
22
|
+
updateRendererConfig: (name: string, config: Record<string, unknown>) => void;
|
|
23
|
+
getRightAxisWidth: () => number;
|
|
24
|
+
getPriceLabelWidth: () => number;
|
|
25
|
+
getYPaddingPx: () => number;
|
|
26
|
+
getCrosshairPos: () => {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
} | null;
|
|
30
|
+
getCrosshairPrice: () => number | null;
|
|
31
|
+
getActivePaneId: () => string | null;
|
|
32
|
+
}
|
|
12
33
|
export declare class SubPaneManager {
|
|
13
34
|
private entries;
|
|
14
35
|
private _entriesSignal;
|
|
15
36
|
get entriesSignal(): Signal<ReadonlyArray<SubPaneEntry>>;
|
|
16
37
|
private syncEntriesSignal;
|
|
17
|
-
create(
|
|
18
|
-
remove(
|
|
19
|
-
replaceIndicator(
|
|
20
|
-
updateParams(
|
|
38
|
+
create(ctx: SubPaneContext, paneId: string, indicatorId: SubIndicatorType, params: Record<string, unknown>): boolean;
|
|
39
|
+
remove(ctx: SubPaneContext, paneId: string): void;
|
|
40
|
+
replaceIndicator(ctx: SubPaneContext, paneId: string, newIndicatorId: SubIndicatorType, newParams: Record<string, unknown>): void;
|
|
41
|
+
updateParams(ctx: SubPaneContext, paneId: string, params: Record<string, unknown>): void;
|
|
21
42
|
getByPaneId(paneId: string): SubPaneEntry | undefined;
|
|
22
43
|
private createIndicatorRenderer;
|
|
23
44
|
getAll(): SubPaneEntry[];
|
|
24
45
|
getPaneIds(): string[];
|
|
25
|
-
clear(
|
|
46
|
+
clear(ctx: SubPaneContext): void;
|
|
26
47
|
private syncSchedulerConfig;
|
|
27
48
|
private mountScaleRenderer;
|
|
28
49
|
private mountPaneTitleRenderer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subPaneManager.d.ts","sourceRoot":"","sources":["../../src/engine/subPaneManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"subPaneManager.d.ts","sourceRoot":"","sources":["../../src/engine/subPaneManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,66 +12,63 @@ export class SubPaneManager {
|
|
|
12
12
|
syncEntriesSignal() {
|
|
13
13
|
this._entriesSignal.set(this.getAll());
|
|
14
14
|
}
|
|
15
|
-
create(
|
|
15
|
+
create(ctx, paneId, indicatorId, params) {
|
|
16
16
|
if (this.entries.has(paneId)) {
|
|
17
17
|
return true;
|
|
18
18
|
}
|
|
19
19
|
const scaleRendererName = `${indicatorId.toLowerCase()}_scale_${paneId}`;
|
|
20
20
|
const paneTitleRendererName = `paneTitle_${paneId}`;
|
|
21
|
-
const renderer = this.createIndicatorRenderer(
|
|
21
|
+
const renderer = this.createIndicatorRenderer(ctx, paneId, indicatorId, params);
|
|
22
22
|
if (!renderer)
|
|
23
23
|
return false;
|
|
24
24
|
const rendererName = renderer.name;
|
|
25
|
-
const paneExists =
|
|
25
|
+
const paneExists = ctx.hasPane(paneId);
|
|
26
26
|
if (!paneExists) {
|
|
27
|
-
|
|
27
|
+
ctx.upsertPane({ id: paneId, ratio: 1, visible: true, role: 'indicator' });
|
|
28
28
|
}
|
|
29
|
-
const existingRenderer =
|
|
29
|
+
const existingRenderer = ctx.getRenderer(rendererName);
|
|
30
30
|
if (!existingRenderer) {
|
|
31
|
-
|
|
31
|
+
ctx.useRenderer(renderer, params);
|
|
32
32
|
}
|
|
33
|
-
this.mountScaleRenderer(
|
|
34
|
-
this.mountPaneTitleRenderer(
|
|
35
|
-
// 必须在 syncSchedulerConfig 之前注册 entry,
|
|
36
|
-
// 否则 scheduler 的 buildActiveConfig 读不到新 paneId,会将新指标的 show* 标志置为 false
|
|
33
|
+
this.mountScaleRenderer(ctx, paneId, indicatorId, scaleRendererName);
|
|
34
|
+
this.mountPaneTitleRenderer(ctx, paneId, indicatorId, params);
|
|
37
35
|
this.entries.set(paneId, { paneId, indicatorId, params, rendererName, scaleRendererName, paneTitleRendererName });
|
|
38
|
-
this.syncSchedulerConfig(
|
|
39
|
-
|
|
36
|
+
this.syncSchedulerConfig(ctx, paneId, indicatorId, params);
|
|
37
|
+
ctx.getIndicatorScheduler().onSubPaneChanged();
|
|
40
38
|
this.syncEntriesSignal();
|
|
41
39
|
return true;
|
|
42
40
|
}
|
|
43
|
-
remove(
|
|
41
|
+
remove(ctx, paneId) {
|
|
44
42
|
const entry = this.entries.get(paneId);
|
|
45
43
|
if (!entry)
|
|
46
44
|
return;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
ctx.removeRenderer(entry.rendererName);
|
|
46
|
+
ctx.removeRenderer(entry.scaleRendererName);
|
|
47
|
+
ctx.removeRenderer(entry.paneTitleRendererName);
|
|
50
48
|
this.entries.delete(paneId);
|
|
51
|
-
if (
|
|
52
|
-
|
|
49
|
+
if (ctx.hasPane(paneId)) {
|
|
50
|
+
ctx.removePaneDefinition(paneId);
|
|
53
51
|
}
|
|
54
|
-
|
|
52
|
+
ctx.getIndicatorScheduler().onSubPaneChanged();
|
|
55
53
|
this.syncEntriesSignal();
|
|
56
54
|
}
|
|
57
|
-
replaceIndicator(
|
|
55
|
+
replaceIndicator(ctx, paneId, newIndicatorId, newParams) {
|
|
58
56
|
const entry = this.entries.get(paneId);
|
|
59
57
|
if (!entry)
|
|
60
58
|
return;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
chart.removeRenderer(entry.paneTitleRendererName);
|
|
59
|
+
ctx.removeRenderer(entry.rendererName);
|
|
60
|
+
ctx.removeRenderer(entry.scaleRendererName);
|
|
61
|
+
ctx.removeRenderer(entry.paneTitleRendererName);
|
|
65
62
|
const newScaleRendererName = `${newIndicatorId.toLowerCase()}_scale_${paneId}`;
|
|
66
63
|
const newPaneTitleRendererName = `paneTitle_${paneId}`;
|
|
67
|
-
const renderer = this.createIndicatorRenderer(
|
|
64
|
+
const renderer = this.createIndicatorRenderer(ctx, paneId, newIndicatorId, newParams);
|
|
68
65
|
if (!renderer)
|
|
69
66
|
return;
|
|
70
67
|
const newRendererName = renderer.name;
|
|
71
|
-
|
|
72
|
-
this.mountScaleRenderer(
|
|
73
|
-
this.mountPaneTitleRenderer(
|
|
74
|
-
this.syncSchedulerConfig(
|
|
68
|
+
ctx.useRenderer(renderer, newParams);
|
|
69
|
+
this.mountScaleRenderer(ctx, paneId, newIndicatorId, newScaleRendererName);
|
|
70
|
+
this.mountPaneTitleRenderer(ctx, paneId, newIndicatorId, newParams);
|
|
71
|
+
this.syncSchedulerConfig(ctx, paneId, newIndicatorId, newParams);
|
|
75
72
|
this.entries.set(paneId, {
|
|
76
73
|
paneId,
|
|
77
74
|
indicatorId: newIndicatorId,
|
|
@@ -80,23 +77,24 @@ export class SubPaneManager {
|
|
|
80
77
|
scaleRendererName: newScaleRendererName,
|
|
81
78
|
paneTitleRendererName: newPaneTitleRendererName,
|
|
82
79
|
});
|
|
83
|
-
|
|
80
|
+
ctx.getIndicatorScheduler().onSubPaneChanged();
|
|
84
81
|
this.syncEntriesSignal();
|
|
85
82
|
}
|
|
86
|
-
updateParams(
|
|
83
|
+
updateParams(ctx, paneId, params) {
|
|
87
84
|
const entry = this.entries.get(paneId);
|
|
88
85
|
if (!entry)
|
|
89
86
|
return;
|
|
90
87
|
entry.params = { ...params };
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
ctx.updateRendererConfig(entry.rendererName, params);
|
|
89
|
+
ctx.updateRendererConfig(entry.paneTitleRendererName, { params: entry.params, indicatorId: entry.indicatorId });
|
|
90
|
+
this.syncSchedulerConfig(ctx, paneId, entry.indicatorId, entry.params);
|
|
93
91
|
this.syncEntriesSignal();
|
|
94
92
|
}
|
|
95
93
|
getByPaneId(paneId) {
|
|
96
94
|
return this.entries.get(paneId);
|
|
97
95
|
}
|
|
98
|
-
createIndicatorRenderer(
|
|
99
|
-
const definition =
|
|
96
|
+
createIndicatorRenderer(ctx, paneId, indicatorId, params) {
|
|
97
|
+
const definition = ctx.getIndicatorScheduler().getIndicatorMetadata(indicatorId);
|
|
100
98
|
if (!definition) {
|
|
101
99
|
throw new Error(`[SubPaneManager] Unknown indicator: ${indicatorId}`);
|
|
102
100
|
}
|
|
@@ -108,44 +106,44 @@ export class SubPaneManager {
|
|
|
108
106
|
getPaneIds() {
|
|
109
107
|
return Array.from(this.entries.keys());
|
|
110
108
|
}
|
|
111
|
-
clear(
|
|
109
|
+
clear(ctx) {
|
|
112
110
|
for (const entry of this.entries.values()) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
111
|
+
ctx.removeRenderer(entry.rendererName);
|
|
112
|
+
ctx.removeRenderer(entry.scaleRendererName);
|
|
113
|
+
ctx.removeRenderer(entry.paneTitleRendererName);
|
|
116
114
|
}
|
|
117
115
|
this.entries.clear();
|
|
118
|
-
|
|
116
|
+
ctx.getIndicatorScheduler().onSubPaneChanged();
|
|
119
117
|
this.syncEntriesSignal();
|
|
120
118
|
}
|
|
121
|
-
syncSchedulerConfig(
|
|
122
|
-
const scheduler =
|
|
119
|
+
syncSchedulerConfig(ctx, paneId, indicatorId, params) {
|
|
120
|
+
const scheduler = ctx.getIndicatorScheduler();
|
|
123
121
|
const definition = scheduler.getIndicatorMetadata(indicatorId);
|
|
124
122
|
definition?.updateConfig?.(scheduler, params, paneId);
|
|
125
123
|
}
|
|
126
|
-
mountScaleRenderer(
|
|
127
|
-
const existing =
|
|
124
|
+
mountScaleRenderer(ctx, paneId, indicatorId, scaleRendererName) {
|
|
125
|
+
const existing = ctx.getRenderer(scaleRendererName);
|
|
128
126
|
if (existing)
|
|
129
127
|
return;
|
|
130
|
-
const axisWidth =
|
|
131
|
-
const yPaddingPx =
|
|
128
|
+
const axisWidth = ctx.getRightAxisWidth() + (ctx.getPriceLabelWidth() ?? 60);
|
|
129
|
+
const yPaddingPx = ctx.getYPaddingPx();
|
|
132
130
|
const getCrosshair = () => {
|
|
133
|
-
const pos =
|
|
134
|
-
const price =
|
|
135
|
-
const activePaneId =
|
|
131
|
+
const pos = ctx.getCrosshairPos();
|
|
132
|
+
const price = ctx.getCrosshairPrice();
|
|
133
|
+
const activePaneId = ctx.getActivePaneId();
|
|
136
134
|
if (pos && price !== null) {
|
|
137
135
|
return { y: pos.y, price, activePaneId };
|
|
138
136
|
}
|
|
139
137
|
return null;
|
|
140
138
|
};
|
|
141
139
|
const opts = { axisWidth, paneId, yPaddingPx, getCrosshair };
|
|
142
|
-
const definition =
|
|
140
|
+
const definition = ctx.getIndicatorScheduler().getIndicatorMetadata(indicatorId);
|
|
143
141
|
if (definition?.scaleRendererFactory) {
|
|
144
|
-
|
|
142
|
+
ctx.useRenderer(definition.scaleRendererFactory({ ...opts, indicatorId }));
|
|
145
143
|
return;
|
|
146
144
|
}
|
|
147
145
|
if (definition?.scale) {
|
|
148
|
-
|
|
146
|
+
ctx.useRenderer(createIndicatorScaleRendererPlugin({
|
|
149
147
|
...opts,
|
|
150
148
|
indicatorKey: definition.scale.indicatorKey ?? definition.name,
|
|
151
149
|
label: definition.scale.label ?? definition.displayName,
|
|
@@ -154,11 +152,11 @@ export class SubPaneManager {
|
|
|
154
152
|
return;
|
|
155
153
|
}
|
|
156
154
|
}
|
|
157
|
-
mountPaneTitleRenderer(
|
|
155
|
+
mountPaneTitleRenderer(ctx, paneId, indicatorId, params) {
|
|
158
156
|
const rendererName = `paneTitle_${paneId}`;
|
|
159
|
-
const existing =
|
|
157
|
+
const existing = ctx.getRenderer(rendererName);
|
|
160
158
|
if (existing) {
|
|
161
|
-
|
|
159
|
+
ctx.updateRendererConfig(rendererName, { params, indicatorId });
|
|
162
160
|
return;
|
|
163
161
|
}
|
|
164
162
|
const renderer = createPaneTitleRendererPlugin({
|
|
@@ -167,7 +165,7 @@ export class SubPaneManager {
|
|
|
167
165
|
indicatorId,
|
|
168
166
|
params,
|
|
169
167
|
});
|
|
170
|
-
|
|
168
|
+
ctx.useRenderer(renderer);
|
|
171
169
|
}
|
|
172
170
|
}
|
|
173
171
|
//# sourceMappingURL=subPaneManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subPaneManager.js","sourceRoot":"","sources":["../../src/engine/subPaneManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subPaneManager.js","sourceRoot":"","sources":["../../src/engine/subPaneManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface ZoomCommittedResult {
|
|
2
|
+
kWidth: number;
|
|
3
|
+
kGap: number;
|
|
4
|
+
zoomLevel: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ZoomDependencies {
|
|
7
|
+
getLogicalScrollLeft: () => number;
|
|
8
|
+
getCurrentDpr: () => number;
|
|
9
|
+
getLeftLoadBufferWidth: () => number;
|
|
10
|
+
setScrollLeft: (v: number) => void;
|
|
11
|
+
onZoomCommitted: (result: ZoomCommittedResult) => void;
|
|
12
|
+
getKWidth: () => number;
|
|
13
|
+
getKGap: () => number;
|
|
14
|
+
getMinKWidth: () => number;
|
|
15
|
+
getMaxKWidth: () => number;
|
|
16
|
+
zoomLevelCount: number;
|
|
17
|
+
initialZoomLevel: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class ChartZoomController {
|
|
20
|
+
private _currentZoomLevel;
|
|
21
|
+
private readonly deps;
|
|
22
|
+
constructor(deps: ZoomDependencies);
|
|
23
|
+
get currentZoomLevel(): number;
|
|
24
|
+
get zoomLevelCount(): number;
|
|
25
|
+
setZoomLevel(level: number): void;
|
|
26
|
+
zoomToLevel(level: number, anchorX?: number): void;
|
|
27
|
+
zoomIn(anchorX?: number): void;
|
|
28
|
+
zoomOut(anchorX?: number): void;
|
|
29
|
+
handleWheel(deltaY: number, viewportX: number): void;
|
|
30
|
+
handlePinch(delta: number, centerClientX: number): void;
|
|
31
|
+
private applyZoom;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=chartZoomController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartZoomController.d.ts","sourceRoot":"","sources":["../../../src/engine/utils/chartZoomController.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB,EAAE,MAAM,MAAM,CAAA;IAClC,aAAa,EAAE,MAAM,MAAM,CAAA;IAC3B,sBAAsB,EAAE,MAAM,MAAM,CAAA;IACpC,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,eAAe,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAA;IACtD,SAAS,EAAE,MAAM,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;gBAE3B,IAAI,EAAE,gBAAgB;IAMlC,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlD,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAI/B,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOpD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAMvD,OAAO,CAAC,SAAS;CAiClB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { computeZoom } from './zoom';
|
|
2
|
+
export class ChartZoomController {
|
|
3
|
+
_currentZoomLevel;
|
|
4
|
+
deps;
|
|
5
|
+
constructor(deps) {
|
|
6
|
+
this.deps = deps;
|
|
7
|
+
const clamped = Math.max(1, Math.min(deps.zoomLevelCount, deps.initialZoomLevel ?? 1));
|
|
8
|
+
this._currentZoomLevel = clamped;
|
|
9
|
+
}
|
|
10
|
+
get currentZoomLevel() {
|
|
11
|
+
return this._currentZoomLevel;
|
|
12
|
+
}
|
|
13
|
+
get zoomLevelCount() {
|
|
14
|
+
return this.deps.zoomLevelCount;
|
|
15
|
+
}
|
|
16
|
+
setZoomLevel(level) {
|
|
17
|
+
this._currentZoomLevel = Math.max(1, Math.min(this.deps.zoomLevelCount, level));
|
|
18
|
+
}
|
|
19
|
+
zoomToLevel(level, anchorX) {
|
|
20
|
+
const clamped = Math.max(1, Math.min(this.deps.zoomLevelCount, Math.round(level)));
|
|
21
|
+
this.applyZoom(clamped, anchorX);
|
|
22
|
+
}
|
|
23
|
+
zoomIn(anchorX) {
|
|
24
|
+
this.zoomToLevel(this._currentZoomLevel + 1, anchorX);
|
|
25
|
+
}
|
|
26
|
+
zoomOut(anchorX) {
|
|
27
|
+
this.zoomToLevel(this._currentZoomLevel - 1, anchorX);
|
|
28
|
+
}
|
|
29
|
+
handleWheel(deltaY, viewportX) {
|
|
30
|
+
const delta = deltaY > 0 ? -1 : 1;
|
|
31
|
+
const targetLevel = Math.max(1, Math.min(this.deps.zoomLevelCount, this._currentZoomLevel + delta));
|
|
32
|
+
if (targetLevel === this._currentZoomLevel)
|
|
33
|
+
return;
|
|
34
|
+
this.applyZoom(targetLevel, viewportX);
|
|
35
|
+
}
|
|
36
|
+
handlePinch(delta, centerClientX) {
|
|
37
|
+
const targetLevel = Math.max(1, Math.min(this.deps.zoomLevelCount, this._currentZoomLevel + delta));
|
|
38
|
+
if (targetLevel === this._currentZoomLevel)
|
|
39
|
+
return;
|
|
40
|
+
this.applyZoom(targetLevel, centerClientX);
|
|
41
|
+
}
|
|
42
|
+
applyZoom(targetLevel, anchorViewportX) {
|
|
43
|
+
if (targetLevel === this._currentZoomLevel)
|
|
44
|
+
return;
|
|
45
|
+
const delta = targetLevel - this._currentZoomLevel;
|
|
46
|
+
const logicalScrollLeft = this.deps.getLogicalScrollLeft();
|
|
47
|
+
const dpr = this.deps.getCurrentDpr();
|
|
48
|
+
const result = computeZoom(delta, anchorViewportX ?? 0, logicalScrollLeft, this._currentZoomLevel, this.deps.getKWidth(), this.deps.getKGap(), {
|
|
49
|
+
minKWidth: this.deps.getMinKWidth(),
|
|
50
|
+
maxKWidth: this.deps.getMaxKWidth(),
|
|
51
|
+
zoomLevelCount: this.deps.zoomLevelCount,
|
|
52
|
+
dpr,
|
|
53
|
+
});
|
|
54
|
+
if (!result)
|
|
55
|
+
return;
|
|
56
|
+
const domScrollLeft = result.newScrollLeft + this.deps.getLeftLoadBufferWidth();
|
|
57
|
+
this._currentZoomLevel = result.targetLevel;
|
|
58
|
+
this.deps.setScrollLeft(domScrollLeft);
|
|
59
|
+
this.deps.onZoomCommitted({
|
|
60
|
+
kWidth: result.newKWidth,
|
|
61
|
+
kGap: result.newKGap,
|
|
62
|
+
zoomLevel: result.targetLevel,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=chartZoomController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartZoomController.js","sourceRoot":"","sources":["../../../src/engine/utils/chartZoomController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ChartDom, Viewport, ViewportState } from '../chartTypes';
|
|
2
|
+
import type { VisibleRange, UpdateLevel } from '../layout/pane';
|
|
3
|
+
import { type Signal } from '../../reactivity/signal';
|
|
4
|
+
export interface ViewportDependencies {
|
|
5
|
+
getDom: () => ChartDom;
|
|
6
|
+
getBottomAxisHeight: () => number;
|
|
7
|
+
getLeftLoadBufferWidth: () => number;
|
|
8
|
+
getZoomLevel: () => number;
|
|
9
|
+
getLastVisibleRange: () => VisibleRange;
|
|
10
|
+
getKWidth: () => number;
|
|
11
|
+
getKGap: () => number;
|
|
12
|
+
scheduleDraw: (level?: UpdateLevel) => void;
|
|
13
|
+
onResizeCompleted: () => void;
|
|
14
|
+
resizeSharedWebGLSurface: (plotWidth: number, plotHeight: number, dpr: number) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare class ChartViewportManager {
|
|
17
|
+
private deps;
|
|
18
|
+
/** 精确 DPR(来自 ResizeObserver 的 devicePixelContentBoxSize) */
|
|
19
|
+
private preciseDpr;
|
|
20
|
+
/** 统一监听容器尺寸与 DPR 变化 */
|
|
21
|
+
private resizeObserver?;
|
|
22
|
+
/** scroll 事件处理器引用(用于 cleanup) */
|
|
23
|
+
private onScroll?;
|
|
24
|
+
/** 最近一次观测到的容器尺寸 */
|
|
25
|
+
private observedSize;
|
|
26
|
+
/** 缓存的 scrollLeft(通过 scroll 事件同步,避免每帧读取 DOM 触发强制回流) */
|
|
27
|
+
private cachedScrollLeft;
|
|
28
|
+
/** 待写入 DOM 的 scrollLeft(在 RAF 回调中应用,确保 Vue 已完成 DOM 更新) */
|
|
29
|
+
private _pendingScrollLeft;
|
|
30
|
+
/** 内部视口状态 */
|
|
31
|
+
private _internalViewport;
|
|
32
|
+
/** 视口状态信号 */
|
|
33
|
+
private _viewportSignal;
|
|
34
|
+
constructor(deps: ViewportDependencies);
|
|
35
|
+
/** 视口状态信号 */
|
|
36
|
+
get viewportSignal(): Signal<ViewportState>;
|
|
37
|
+
/** 获取缓存的 scrollLeft(避免读取 DOM 触发强制回流) */
|
|
38
|
+
getCachedScrollLeft(): number;
|
|
39
|
+
/** 获取逻辑 scrollLeft(减去左侧加载缓冲宽度,可为负值) */
|
|
40
|
+
getLogicalScrollLeft(): number;
|
|
41
|
+
/** 获取当前视口 */
|
|
42
|
+
getViewport(): Viewport | null;
|
|
43
|
+
/** 获取有效 DPR */
|
|
44
|
+
getEffectiveDpr(): number;
|
|
45
|
+
/** 获取观测到的容器尺寸 */
|
|
46
|
+
getObservedSize(): {
|
|
47
|
+
width: number;
|
|
48
|
+
height: number;
|
|
49
|
+
};
|
|
50
|
+
/** 设置滚动位置(缓存 + 待写入) */
|
|
51
|
+
setScrollLeft(v: number): void;
|
|
52
|
+
/** 仅设置缓存 scrollLeft(由 DataManager 内部使用) */
|
|
53
|
+
setCachedScrollLeft(v: number): void;
|
|
54
|
+
/** 仅设置待写入 scrollLeft(由 DataManager 内部使用) */
|
|
55
|
+
setPendingScrollLeft(v: number): void;
|
|
56
|
+
/** 在 RAF 回调中应用待写入的 scrollLeft */
|
|
57
|
+
applyPendingScrollLeft(container: HTMLElement): void;
|
|
58
|
+
/** 初始化 ResizeObserver 和 scroll 监听 */
|
|
59
|
+
init(): void;
|
|
60
|
+
/** 销毁 */
|
|
61
|
+
destroy(): void;
|
|
62
|
+
/**
|
|
63
|
+
* 计算视口
|
|
64
|
+
*/
|
|
65
|
+
computeViewport(): Viewport | null;
|
|
66
|
+
/**
|
|
67
|
+
* 更新 viewport signal(用于滚动事件/缩放后的信号同步)
|
|
68
|
+
*/
|
|
69
|
+
updateViewportSignal(): void;
|
|
70
|
+
private updateObservedMetrics;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=chartViewportManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartViewportManager.d.ts","sourceRoot":"","sources":["../../../src/engine/viewport/chartViewportManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEnE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,QAAQ,CAAA;IACtB,mBAAmB,EAAE,MAAM,MAAM,CAAA;IACjC,sBAAsB,EAAE,MAAM,MAAM,CAAA;IACpC,YAAY,EAAE,MAAM,MAAM,CAAA;IAC1B,mBAAmB,EAAE,MAAM,YAAY,CAAA;IACvC,SAAS,EAAE,MAAM,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,KAAK,IAAI,CAAA;IAC3C,iBAAiB,EAAE,MAAM,IAAI,CAAA;IAC7B,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACvF;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAsB;IAElC,4DAA4D;IAC5D,OAAO,CAAC,UAAU,CAAI;IAEtB,uBAAuB;IACvB,OAAO,CAAC,cAAc,CAAC,CAAgB;IAEvC,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAY;IAE7B,mBAAmB;IACnB,OAAO,CAAC,YAAY,CAA0B;IAE9C,uDAAuD;IACvD,OAAO,CAAC,gBAAgB,CAAI;IAE5B,0DAA0D;IAC1D,OAAO,CAAC,kBAAkB,CAAsB;IAEhD,aAAa;IACb,OAAO,CAAC,iBAAiB,CAAwB;IAEjD,aAAa;IACb,OAAO,CAAC,eAAe,CASrB;gBAEU,IAAI,EAAE,oBAAoB;IAItC,aAAa;IACb,IAAI,cAAc,IAAI,MAAM,CAAC,aAAa,CAAC,CAE1C;IAED,wCAAwC;IACxC,mBAAmB,IAAI,MAAM;IAI7B,uCAAuC;IACvC,oBAAoB,IAAI,MAAM;IAI9B,aAAa;IACb,WAAW,IAAI,QAAQ,GAAG,IAAI;IAI9B,eAAe;IACf,eAAe,IAAI,MAAM;IAQzB,iBAAiB;IACjB,eAAe,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAIpD,uBAAuB;IACvB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAK9B,2CAA2C;IAC3C,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpC,4CAA4C;IAC5C,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIrC,iCAAiC;IACjC,sBAAsB,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAQpD,qCAAqC;IACrC,IAAI,IAAI,IAAI;IA4CZ,SAAS;IACT,OAAO,IAAI,IAAI;IAcf;;OAEG;IACH,eAAe,IAAI,QAAQ,GAAG,IAAI;IA+FlC;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAgB5B,OAAO,CAAC,qBAAqB;CAgB9B"}
|