@baron1996/klinecharts-adapter 0.9.4 → 0.9.5
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/adapter.d.ts +2 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +461 -56
- package/dist/drawing/engine-port.d.ts +15 -0
- package/dist/drawing/engine-port.d.ts.map +1 -1
- package/dist/engine.d.ts +10 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +24 -0
- package/dist/interaction/dragging.d.ts.map +1 -1
- package/dist/interaction/dragging.js +149 -44
- package/dist/interaction/hit-testing.d.ts +16 -1
- package/dist/interaction/hit-testing.d.ts.map +1 -1
- package/dist/interaction/hit-testing.js +25 -4
- package/dist/interaction/overlay-geometry.d.ts +15 -0
- package/dist/interaction/overlay-geometry.d.ts.map +1 -0
- package/dist/interaction/overlay-geometry.js +228 -0
- package/dist/interaction/touch-precision-drawing.d.ts +29 -0
- package/dist/interaction/touch-precision-drawing.d.ts.map +1 -0
- package/dist/interaction/touch-precision-drawing.js +273 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -27,6 +27,21 @@ export interface EngineDrawingStartRequest {
|
|
|
27
27
|
readonly metadata?: NonNullable<Drawing['metadata']>;
|
|
28
28
|
readonly text?: string;
|
|
29
29
|
}
|
|
30
|
+
export interface DrawingHitTolerance {
|
|
31
|
+
readonly body: number;
|
|
32
|
+
readonly anchor: number;
|
|
33
|
+
}
|
|
34
|
+
/** 宿主可选的 Drawing 输入策略;默认继续使用 KLineCharts 原生交互。 */
|
|
35
|
+
export interface DrawingInteractionOptions {
|
|
36
|
+
readonly touch?: 'native' | 'precision-cursor';
|
|
37
|
+
/** 选中 Drawing 后是否独占图表输入,直到显式取消选择。 */
|
|
38
|
+
readonly exclusiveSelection?: boolean;
|
|
39
|
+
/** CSS 像素命中半径;未配置项分别使用桌面 12/14、触摸 22/24。 */
|
|
40
|
+
readonly hitTolerance?: {
|
|
41
|
+
readonly mouse?: Partial<DrawingHitTolerance>;
|
|
42
|
+
readonly touch?: Partial<DrawingHitTolerance>;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
30
45
|
export type EngineDrawingEventType = 'created' | 'updated' | 'removed' | 'selected' | 'deselected' | 'edit-candidate';
|
|
31
46
|
export interface EngineDrawingEvent {
|
|
32
47
|
readonly type: EngineDrawingEventType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-port.d.ts","sourceRoot":"","sources":["../../src/drawing/engine-port.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine-port.d.ts","sourceRoot":"","sources":["../../src/drawing/engine-port.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -6,6 +6,16 @@ export interface EngineHandle {
|
|
|
6
6
|
readonly module: KLineChartsModule;
|
|
7
7
|
/** 显式复位引擎点击仲裁状态;每次绘制开始前调用,避免快速连续绘制的首击被吞。 */
|
|
8
8
|
readonly resetClickArbitration: () => void;
|
|
9
|
+
/** 在引擎坐标系内移动鼠标语义光标,用于触摸精确绘制预览。 */
|
|
10
|
+
readonly dispatchMouseMove: (event: EngineMouseInteraction) => void;
|
|
11
|
+
/** 在引擎坐标系内触发单击语义,用于触摸精确绘制落点。 */
|
|
12
|
+
readonly dispatchMouseClick: (event: EngineMouseInteraction) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface EngineMouseInteraction {
|
|
15
|
+
readonly x: number;
|
|
16
|
+
readonly y: number;
|
|
17
|
+
readonly pageX: number;
|
|
18
|
+
readonly pageY: number;
|
|
9
19
|
}
|
|
10
20
|
/** 按固定顺序创建并初始化唯一的 KLineCharts 引擎。 */
|
|
11
21
|
export declare function createEngine(container: HTMLElement, scene: ChartScene, options?: {
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUzC,MAAM,MAAM,iBAAiB,GAAG,cAAc,aAAa,CAAC,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUzC,MAAM,MAAM,iBAAiB,GAAG,cAAc,aAAa,CAAC,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAC3C,kCAAkC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACpE,gCAAgC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAqFD,qCAAqC;AACrC,wBAAsB,YAAY,CACjC,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,UAAU,EACjB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,YAAY,CAAC,CAyCvB"}
|
package/dist/engine.js
CHANGED
|
@@ -2,6 +2,27 @@ import { SceneError } from '@baron1996/kline-scene-schema';
|
|
|
2
2
|
import { toKLineChartsOptions } from './conversion/chart-options.js';
|
|
3
3
|
import { createStaticDataLoader } from './static-data-loader.js';
|
|
4
4
|
import { KLINECHARTS_ENGINE_VERSION, KLINECHARTS_RUNTIME_VERSION, SUPPORTED_KLINECHARTS_RUNTIME_VERSIONS, } from './version.js';
|
|
5
|
+
function resolveMouseInteractionDispatch(chart) {
|
|
6
|
+
const chartEvent = chart._chartEvent;
|
|
7
|
+
if (chartEvent === undefined ||
|
|
8
|
+
typeof chartEvent.mouseMoveEvent !== 'function' ||
|
|
9
|
+
typeof chartEvent.mouseClickEvent !== 'function') {
|
|
10
|
+
throw new SceneError('RUNTIME_INIT_FAILED', '/runtime', `KLineCharts ${KLINECHARTS_ENGINE_VERSION} 内部鼠标语义派发钩子不可用;引擎私有结构可能已变化。`);
|
|
11
|
+
}
|
|
12
|
+
const compatEvent = (event) => ({
|
|
13
|
+
...event,
|
|
14
|
+
isTouch: false,
|
|
15
|
+
preventDefault: () => undefined,
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
move: (event) => {
|
|
19
|
+
chartEvent.mouseMoveEvent(compatEvent(event));
|
|
20
|
+
},
|
|
21
|
+
click: (event) => {
|
|
22
|
+
chartEvent.mouseClickEvent(compatEvent(event));
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
5
26
|
function resolveClickArbitrationReset(chart) {
|
|
6
27
|
const eventHandler = chart
|
|
7
28
|
._chartEvent?._event;
|
|
@@ -42,9 +63,12 @@ export async function createEngine(container, scene, options) {
|
|
|
42
63
|
});
|
|
43
64
|
chart.setPeriod(structuredClone(scene.period));
|
|
44
65
|
chart.setDataLoader(createStaticDataLoader(scene.data));
|
|
66
|
+
const mouseInteraction = resolveMouseInteractionDispatch(chart);
|
|
45
67
|
return {
|
|
46
68
|
chart,
|
|
47
69
|
module: engine,
|
|
48
70
|
resetClickArbitration: resolveClickArbitrationReset(chart),
|
|
71
|
+
dispatchMouseMove: mouseInteraction.move,
|
|
72
|
+
dispatchMouseClick: mouseInteraction.click,
|
|
49
73
|
};
|
|
50
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dragging.d.ts","sourceRoot":"","sources":["../../src/interaction/dragging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;
|
|
1
|
+
{"version":3,"file":"dragging.d.ts","sourceRoot":"","sources":["../../src/interaction/dragging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAwED,wCAAwC;AACxC,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,cAAc,EAAE,MAAM,GACpB,YAAY,CAyJd"}
|
|
@@ -13,59 +13,164 @@ function requireTimestamp(timestamps, index, path) {
|
|
|
13
13
|
}
|
|
14
14
|
return timestamp;
|
|
15
15
|
}
|
|
16
|
+
function normalizedValue(value, pricePrecision, path) {
|
|
17
|
+
return normalizePriceValue(value, pricePrecision, path);
|
|
18
|
+
}
|
|
19
|
+
function timestampAtCurrentPoint(current, timestamps, path) {
|
|
20
|
+
return requireTimestamp(timestamps, requireDataIndex(current.dataIndex, `${path}/dataIndex`), path);
|
|
21
|
+
}
|
|
22
|
+
function translatedTimestamp(timestamp, deltaIndex, timestamps, path) {
|
|
23
|
+
const sourceIndex = timestamps.indexOf(timestamp);
|
|
24
|
+
if (sourceIndex < 0) {
|
|
25
|
+
throw new SceneError('INVALID_REFERENCE', path, 'Overlay point must reference an embedded bar before dragging.');
|
|
26
|
+
}
|
|
27
|
+
return requireTimestamp(timestamps, sourceIndex + deltaIndex, path);
|
|
28
|
+
}
|
|
29
|
+
function translatedPoint(point, deltaIndex, deltaValue, timestamps, pricePrecision, path) {
|
|
30
|
+
return {
|
|
31
|
+
timestamp: translatedTimestamp(point.timestamp, deltaIndex, timestamps, `${path}/timestamp`),
|
|
32
|
+
value: normalizedValue(point.value + deltaValue, pricePrecision, `${path}/value`),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function currentPoint(current, timestamps, pricePrecision, path) {
|
|
36
|
+
return {
|
|
37
|
+
timestamp: timestampAtCurrentPoint(current, timestamps, `${path}/timestamp`),
|
|
38
|
+
value: normalizedValue(current.value, pricePrecision, `${path}/value`),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
16
41
|
/** 根据冻结的绝对平移语义构造未提交候选,不修改输入 Overlay。 */
|
|
17
42
|
export function createDragCandidate(before, dragTarget, origin, current, timestamps, pricePrecision) {
|
|
18
43
|
const deltaValue = current.value - origin.value;
|
|
19
44
|
if (!Number.isFinite(deltaValue)) {
|
|
20
45
|
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays', 'Drag price delta must be finite.');
|
|
21
46
|
}
|
|
22
|
-
if (before.type === 'horizontalStraightLine') {
|
|
23
|
-
const anchor = before.anchor;
|
|
24
|
-
if (anchor === undefined || !('value' in anchor)) {
|
|
25
|
-
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/anchor', 'Missing price anchor.');
|
|
26
|
-
}
|
|
27
|
-
return {
|
|
28
|
-
...structuredClone(before),
|
|
29
|
-
anchor: {
|
|
30
|
-
value: normalizePriceValue(anchor.value + deltaValue, pricePrecision, '/overlays/anchor/value'),
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
if (before.type !== 'priceMeasurement' || before.start === undefined || before.end === undefined) {
|
|
35
|
-
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/type', 'Controlled M2 dragging only supports horizontalStraightLine and priceMeasurement.');
|
|
36
|
-
}
|
|
37
47
|
const candidate = structuredClone(before);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
const deltaIndex = requireDataIndex(current.dataIndex, '/overlays/body/dataIndex') -
|
|
49
|
+
requireDataIndex(origin.dataIndex, '/overlays/body/originDataIndex');
|
|
50
|
+
switch (before.type) {
|
|
51
|
+
case 'horizontalStraightLine':
|
|
52
|
+
case 'priceLine':
|
|
53
|
+
case 'simpleTag': {
|
|
54
|
+
const anchor = before.anchor;
|
|
55
|
+
if (anchor === undefined || !('value' in anchor)) {
|
|
56
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/anchor', 'Missing price anchor.');
|
|
57
|
+
}
|
|
58
|
+
candidate.anchor = {
|
|
59
|
+
value: normalizedValue(dragTarget.target === 'anchor' ? current.value : anchor.value + deltaValue, pricePrecision, '/overlays/anchor/value'),
|
|
60
|
+
};
|
|
61
|
+
return candidate;
|
|
41
62
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
63
|
+
case 'verticalStraightLine': {
|
|
64
|
+
const anchor = before.anchor;
|
|
65
|
+
if (anchor === undefined || !('timestamp' in anchor)) {
|
|
66
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/anchor', 'Missing time anchor.');
|
|
67
|
+
}
|
|
68
|
+
candidate.anchor = {
|
|
69
|
+
timestamp: dragTarget.target === 'anchor'
|
|
70
|
+
? timestampAtCurrentPoint(current, timestamps, '/overlays/anchor')
|
|
71
|
+
: translatedTimestamp(anchor.timestamp, deltaIndex, timestamps, '/overlays/anchor/timestamp'),
|
|
72
|
+
};
|
|
73
|
+
return candidate;
|
|
49
74
|
}
|
|
50
|
-
|
|
51
|
-
|
|
75
|
+
case 'horizontalRayLine':
|
|
76
|
+
case 'horizontalSegment': {
|
|
77
|
+
if (before.value === undefined || before.startTimestamp === undefined ||
|
|
78
|
+
before.endTimestamp === undefined) {
|
|
79
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays', 'Missing horizontal line geometry.');
|
|
80
|
+
}
|
|
81
|
+
candidate.value = normalizedValue(dragTarget.target === 'anchor' ? current.value : before.value + deltaValue, pricePrecision, '/overlays/value');
|
|
82
|
+
if (dragTarget.target === 'anchor') {
|
|
83
|
+
const timestamp = timestampAtCurrentPoint(current, timestamps, '/overlays/anchor');
|
|
84
|
+
if (dragTarget.anchorIndex === 0)
|
|
85
|
+
candidate.startTimestamp = timestamp;
|
|
86
|
+
else if (dragTarget.anchorIndex === 1)
|
|
87
|
+
candidate.endTimestamp = timestamp;
|
|
88
|
+
else
|
|
89
|
+
throw new SceneError('INVALID_REFERENCE', '/overlays/anchorIndex', 'Invalid anchor index.');
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
candidate.startTimestamp = translatedTimestamp(before.startTimestamp, deltaIndex, timestamps, '/overlays/startTimestamp');
|
|
93
|
+
candidate.endTimestamp = translatedTimestamp(before.endTimestamp, deltaIndex, timestamps, '/overlays/endTimestamp');
|
|
94
|
+
}
|
|
95
|
+
return candidate;
|
|
96
|
+
}
|
|
97
|
+
case 'verticalRayLine':
|
|
98
|
+
case 'verticalSegment': {
|
|
99
|
+
if (before.timestamp === undefined || before.startValue === undefined ||
|
|
100
|
+
before.endValue === undefined) {
|
|
101
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays', 'Missing vertical line geometry.');
|
|
102
|
+
}
|
|
103
|
+
candidate.timestamp = dragTarget.target === 'anchor'
|
|
104
|
+
? timestampAtCurrentPoint(current, timestamps, '/overlays/anchor')
|
|
105
|
+
: translatedTimestamp(before.timestamp, deltaIndex, timestamps, '/overlays/timestamp');
|
|
106
|
+
if (dragTarget.target === 'anchor') {
|
|
107
|
+
const value = normalizedValue(current.value, pricePrecision, '/overlays/anchor/value');
|
|
108
|
+
if (dragTarget.anchorIndex === 0)
|
|
109
|
+
candidate.startValue = value;
|
|
110
|
+
else if (dragTarget.anchorIndex === 1)
|
|
111
|
+
candidate.endValue = value;
|
|
112
|
+
else
|
|
113
|
+
throw new SceneError('INVALID_REFERENCE', '/overlays/anchorIndex', 'Invalid anchor index.');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
candidate.startValue = normalizedValue(before.startValue + deltaValue, pricePrecision, '/overlays/startValue');
|
|
117
|
+
candidate.endValue = normalizedValue(before.endValue + deltaValue, pricePrecision, '/overlays/endValue');
|
|
118
|
+
}
|
|
119
|
+
return candidate;
|
|
120
|
+
}
|
|
121
|
+
case 'rayLine':
|
|
122
|
+
case 'segment':
|
|
123
|
+
case 'straightLine':
|
|
124
|
+
case 'fibonacciLine':
|
|
125
|
+
case 'priceChannelLine':
|
|
126
|
+
case 'parallelStraightLine':
|
|
127
|
+
case 'brush': {
|
|
128
|
+
if (before.points === undefined) {
|
|
129
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/points', 'Missing point geometry.');
|
|
130
|
+
}
|
|
131
|
+
if (dragTarget.target === 'anchor') {
|
|
132
|
+
if (dragTarget.anchorIndex === null || before.points[dragTarget.anchorIndex] === undefined) {
|
|
133
|
+
throw new SceneError('INVALID_REFERENCE', '/overlays/anchorIndex', 'Invalid anchor index.');
|
|
134
|
+
}
|
|
135
|
+
candidate.points[dragTarget.anchorIndex] = currentPoint(current, timestamps, pricePrecision, `/overlays/points/${dragTarget.anchorIndex}`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
candidate.points = before.points.map((point, index) => translatedPoint(point, deltaIndex, deltaValue, timestamps, pricePrecision, `/overlays/points/${index}`));
|
|
139
|
+
}
|
|
140
|
+
return candidate;
|
|
141
|
+
}
|
|
142
|
+
case 'simpleAnnotation':
|
|
143
|
+
case 'callout':
|
|
144
|
+
case 'text':
|
|
145
|
+
case 'crossLine': {
|
|
146
|
+
if (before.point === undefined) {
|
|
147
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/point', 'Missing point geometry.');
|
|
148
|
+
}
|
|
149
|
+
candidate.point = dragTarget.target === 'anchor'
|
|
150
|
+
? currentPoint(current, timestamps, pricePrecision, '/overlays/point')
|
|
151
|
+
: translatedPoint(before.point, deltaIndex, deltaValue, timestamps, pricePrecision, '/overlays/point');
|
|
152
|
+
return candidate;
|
|
153
|
+
}
|
|
154
|
+
case 'rectangle':
|
|
155
|
+
case 'arrow':
|
|
156
|
+
case 'priceMeasurement': {
|
|
157
|
+
if (before.start === undefined || before.end === undefined) {
|
|
158
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays', 'Missing two-point geometry.');
|
|
159
|
+
}
|
|
160
|
+
if (dragTarget.target === 'anchor') {
|
|
161
|
+
const point = currentPoint(current, timestamps, pricePrecision, '/overlays/anchor');
|
|
162
|
+
if (dragTarget.anchorIndex === 0)
|
|
163
|
+
candidate.start = point;
|
|
164
|
+
else if (dragTarget.anchorIndex === 1)
|
|
165
|
+
candidate.end = point;
|
|
166
|
+
else
|
|
167
|
+
throw new SceneError('INVALID_REFERENCE', '/overlays/anchorIndex', 'Invalid anchor index.');
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
candidate.start = translatedPoint(before.start, deltaIndex, deltaValue, timestamps, pricePrecision, '/overlays/start');
|
|
171
|
+
candidate.end = translatedPoint(before.end, deltaIndex, deltaValue, timestamps, pricePrecision, '/overlays/end');
|
|
172
|
+
}
|
|
173
|
+
return candidate;
|
|
52
174
|
}
|
|
53
|
-
return candidate;
|
|
54
|
-
}
|
|
55
|
-
const startIndex = timestamps.indexOf(before.start.timestamp);
|
|
56
|
-
const endIndex = timestamps.indexOf(before.end.timestamp);
|
|
57
|
-
if (startIndex < 0 || endIndex < 0) {
|
|
58
|
-
throw new SceneError('INVALID_REFERENCE', '/overlays', 'priceMeasurement endpoints must reference embedded bars before dragging.');
|
|
59
175
|
}
|
|
60
|
-
const deltaIndex = requireDataIndex(current.dataIndex, '/overlays/body/dataIndex') -
|
|
61
|
-
requireDataIndex(origin.dataIndex, '/overlays/body/originDataIndex');
|
|
62
|
-
candidate.start = {
|
|
63
|
-
timestamp: requireTimestamp(timestamps, startIndex + deltaIndex, '/overlays/start/timestamp'),
|
|
64
|
-
value: normalizePriceValue(before.start.value + deltaValue, pricePrecision, '/overlays/start/value'),
|
|
65
|
-
};
|
|
66
|
-
candidate.end = {
|
|
67
|
-
timestamp: requireTimestamp(timestamps, endIndex + deltaIndex, '/overlays/end/timestamp'),
|
|
68
|
-
value: normalizePriceValue(before.end.value + deltaValue, pricePrecision, '/overlays/end/value'),
|
|
69
|
-
};
|
|
70
|
-
return candidate;
|
|
71
176
|
}
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
export declare const OVERLAY_BODY_HIT_THRESHOLD_CSS_PX = 12;
|
|
2
2
|
export declare const OVERLAY_ANCHOR_HIT_THRESHOLD_CSS_PX = 14;
|
|
3
|
+
export declare const OVERLAY_TOUCH_BODY_HIT_THRESHOLD_CSS_PX = 22;
|
|
4
|
+
export declare const OVERLAY_TOUCH_ANCHOR_HIT_THRESHOLD_CSS_PX = 24;
|
|
5
|
+
export interface OverlayHitTolerance {
|
|
6
|
+
readonly body: number;
|
|
7
|
+
readonly anchor: number;
|
|
8
|
+
}
|
|
9
|
+
export declare const DEFAULT_OVERLAY_MOUSE_HIT_TOLERANCE: OverlayHitTolerance;
|
|
10
|
+
export declare const DEFAULT_OVERLAY_TOUCH_HIT_TOLERANCE: OverlayHitTolerance;
|
|
3
11
|
export interface PixelCoordinate {
|
|
4
12
|
readonly x: number;
|
|
5
13
|
readonly y: number;
|
|
6
14
|
}
|
|
15
|
+
export interface PixelRectangle {
|
|
16
|
+
readonly left: number;
|
|
17
|
+
readonly top: number;
|
|
18
|
+
readonly right: number;
|
|
19
|
+
readonly bottom: number;
|
|
20
|
+
}
|
|
7
21
|
export interface OverlayPixelGeometry {
|
|
8
22
|
readonly overlayId: string;
|
|
9
23
|
readonly sceneIndex: number;
|
|
@@ -11,6 +25,7 @@ export interface OverlayPixelGeometry {
|
|
|
11
25
|
readonly locked: boolean;
|
|
12
26
|
readonly anchors: readonly PixelCoordinate[];
|
|
13
27
|
readonly bodySegments: readonly (readonly [PixelCoordinate, PixelCoordinate])[];
|
|
28
|
+
readonly bodyRectangles?: readonly PixelRectangle[];
|
|
14
29
|
}
|
|
15
30
|
export interface OverlayHitResult {
|
|
16
31
|
readonly overlayId: string;
|
|
@@ -22,5 +37,5 @@ export interface OverlayHitResult {
|
|
|
22
37
|
* 按冻结契约在 CSS 像素坐标中执行命中测试。
|
|
23
38
|
* 锚点全局优先于主体;同类再按 zLevel、Scene 后序和锚点低索引排序。
|
|
24
39
|
*/
|
|
25
|
-
export declare function hitTestOverlayGeometries(point: PixelCoordinate, geometries: readonly OverlayPixelGeometry[]): OverlayHitResult | null;
|
|
40
|
+
export declare function hitTestOverlayGeometries(point: PixelCoordinate, geometries: readonly OverlayPixelGeometry[], tolerance?: OverlayHitTolerance): OverlayHitResult | null;
|
|
26
41
|
//# sourceMappingURL=hit-testing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hit-testing.d.ts","sourceRoot":"","sources":["../../src/interaction/hit-testing.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,mCAAmC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"hit-testing.d.ts","sourceRoot":"","sources":["../../src/interaction/hit-testing.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,uCAAuC,KAAK,CAAC;AAC1D,eAAO,MAAM,yCAAyC,KAAK,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,mCAAmC,EAAE,mBAGjD,CAAC;AAEF,eAAO,MAAM,mCAAmC,EAAE,mBAGjD,CAAC;AAEF,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;IAChF,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AA4DD;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,SAAS,oBAAoB,EAAE,EAC3C,SAAS,GAAE,mBAAyD,GAClE,gBAAgB,GAAG,IAAI,CAmDzB"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
export const OVERLAY_BODY_HIT_THRESHOLD_CSS_PX = 12;
|
|
2
2
|
export const OVERLAY_ANCHOR_HIT_THRESHOLD_CSS_PX = 14;
|
|
3
|
+
export const OVERLAY_TOUCH_BODY_HIT_THRESHOLD_CSS_PX = 22;
|
|
4
|
+
export const OVERLAY_TOUCH_ANCHOR_HIT_THRESHOLD_CSS_PX = 24;
|
|
5
|
+
export const DEFAULT_OVERLAY_MOUSE_HIT_TOLERANCE = {
|
|
6
|
+
body: OVERLAY_BODY_HIT_THRESHOLD_CSS_PX,
|
|
7
|
+
anchor: OVERLAY_ANCHOR_HIT_THRESHOLD_CSS_PX,
|
|
8
|
+
};
|
|
9
|
+
export const DEFAULT_OVERLAY_TOUCH_HIT_TOLERANCE = {
|
|
10
|
+
body: OVERLAY_TOUCH_BODY_HIT_THRESHOLD_CSS_PX,
|
|
11
|
+
anchor: OVERLAY_TOUCH_ANCHOR_HIT_THRESHOLD_CSS_PX,
|
|
12
|
+
};
|
|
3
13
|
function coordinateDistance(left, right) {
|
|
4
14
|
return Math.hypot(left.x - right.x, left.y - right.y);
|
|
5
15
|
}
|
|
@@ -16,7 +26,15 @@ function segmentDistance(point, start, end) {
|
|
|
16
26
|
y: start.y + projection * dy,
|
|
17
27
|
});
|
|
18
28
|
}
|
|
29
|
+
function rectangleDistance(point, rectangle) {
|
|
30
|
+
const horizontal = Math.max(rectangle.left - point.x, 0, point.x - rectangle.right);
|
|
31
|
+
const vertical = Math.max(rectangle.top - point.y, 0, point.y - rectangle.bottom);
|
|
32
|
+
return Math.hypot(horizontal, vertical);
|
|
33
|
+
}
|
|
19
34
|
function compareHits(left, right) {
|
|
35
|
+
if (left.distance !== right.distance) {
|
|
36
|
+
return left.distance - right.distance;
|
|
37
|
+
}
|
|
20
38
|
if (left.zLevel !== right.zLevel) {
|
|
21
39
|
return right.zLevel - left.zLevel;
|
|
22
40
|
}
|
|
@@ -29,13 +47,13 @@ function compareHits(left, right) {
|
|
|
29
47
|
left.anchorIndex !== right.anchorIndex) {
|
|
30
48
|
return left.anchorIndex - right.anchorIndex;
|
|
31
49
|
}
|
|
32
|
-
return
|
|
50
|
+
return 0;
|
|
33
51
|
}
|
|
34
52
|
/**
|
|
35
53
|
* 按冻结契约在 CSS 像素坐标中执行命中测试。
|
|
36
54
|
* 锚点全局优先于主体;同类再按 zLevel、Scene 后序和锚点低索引排序。
|
|
37
55
|
*/
|
|
38
|
-
export function hitTestOverlayGeometries(point, geometries) {
|
|
56
|
+
export function hitTestOverlayGeometries(point, geometries, tolerance = DEFAULT_OVERLAY_MOUSE_HIT_TOLERANCE) {
|
|
39
57
|
const anchorHits = [];
|
|
40
58
|
const bodyHits = [];
|
|
41
59
|
for (const geometry of geometries) {
|
|
@@ -45,7 +63,7 @@ export function hitTestOverlayGeometries(point, geometries) {
|
|
|
45
63
|
continue;
|
|
46
64
|
}
|
|
47
65
|
const distance = coordinateDistance(point, anchor);
|
|
48
|
-
if (distance <=
|
|
66
|
+
if (distance <= tolerance.anchor) {
|
|
49
67
|
anchorHits.push({
|
|
50
68
|
overlayId: geometry.overlayId,
|
|
51
69
|
target: 'anchor',
|
|
@@ -61,7 +79,10 @@ export function hitTestOverlayGeometries(point, geometries) {
|
|
|
61
79
|
for (const [start, end] of geometry.bodySegments) {
|
|
62
80
|
distance = Math.min(distance, segmentDistance(point, start, end));
|
|
63
81
|
}
|
|
64
|
-
|
|
82
|
+
for (const rectangle of geometry.bodyRectangles ?? []) {
|
|
83
|
+
distance = Math.min(distance, rectangleDistance(point, rectangle));
|
|
84
|
+
}
|
|
85
|
+
if (distance <= tolerance.body) {
|
|
65
86
|
bodyHits.push({
|
|
66
87
|
overlayId: geometry.overlayId,
|
|
67
88
|
target: 'body',
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SceneOverlay, TimeValueAnchor } from '@baron1996/kline-scene-schema';
|
|
2
|
+
import type { OverlayPixelGeometry, PixelCoordinate, PixelRectangle } from './hit-testing.js';
|
|
3
|
+
export interface OverlayGeometryProjectionContext {
|
|
4
|
+
readonly bounds: PixelRectangle;
|
|
5
|
+
readonly referenceTimestamp: number;
|
|
6
|
+
readonly referenceValue: number;
|
|
7
|
+
readonly project: (point: TimeValueAnchor) => PixelCoordinate;
|
|
8
|
+
readonly measureText: (text: string, overlay: SceneOverlay) => {
|
|
9
|
+
readonly width: number;
|
|
10
|
+
readonly height: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** 将 Drawing 业务几何投影成与画面一致的 CSS 像素命中几何。 */
|
|
14
|
+
export declare function projectOverlayGeometry(overlay: SceneOverlay, sceneIndex: number, context: OverlayGeometryProjectionContext): OverlayPixelGeometry | null;
|
|
15
|
+
//# sourceMappingURL=overlay-geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay-geometry.d.ts","sourceRoot":"","sources":["../../src/interaction/overlay-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEnF,OAAO,KAAK,EACX,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,eAAe,CAAC;IAC9D,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK;QAC9D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACxB,CAAC;CACF;AAwJD,0CAA0C;AAC1C,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gCAAgC,GACvC,oBAAoB,GAAG,IAAI,CA0I7B"}
|