Skip to content

Commit dcdcf3c

Browse files
authored
Merge pull request #1752 from silx-kit/line-evts
Add line event handlers to `DataCurve`
2 parents 8f5eb7c + 57f8f46 commit dcdcf3c

File tree

2 files changed

+30
-37
lines changed

2 files changed

+30
-37
lines changed

packages/lib/src/vis/line/DataCurve.tsx

+13-37
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { type IgnoreValue, type NumArray } from '@h5web/shared/vis-models';
22
import { type ThreeEvent } from '@react-three/fiber';
3-
import { useCallback } from 'react';
43

54
import ErrorBars from './ErrorBars';
65
import Glyphs from './Glyphs';
76
import Line from './Line';
87
import { CurveType, GlyphType } from './models';
8+
import { useEventHandler } from './utils';
99

1010
interface Props {
1111
abscissas: NumArray;
@@ -17,6 +17,9 @@ interface Props {
1717
glyphType?: GlyphType;
1818
glyphSize?: number;
1919
visible?: boolean;
20+
onLineClick?: (index: number, event: ThreeEvent<MouseEvent>) => void;
21+
onLineEnter?: (index: number, event: ThreeEvent<PointerEvent>) => void;
22+
onLineLeave?: (index: number, event: ThreeEvent<PointerEvent>) => void;
2023
onDataPointClick?: (index: number, evt: ThreeEvent<MouseEvent>) => void;
2124
onDataPointEnter?: (index: number, evt: ThreeEvent<PointerEvent>) => void;
2225
onDataPointLeave?: (index: number, evt: ThreeEvent<PointerEvent>) => void;
@@ -34,45 +37,15 @@ function DataCurve(props: Props) {
3437
glyphType = GlyphType.Cross,
3538
glyphSize = 6,
3639
visible = true,
40+
onLineClick,
41+
onLineEnter,
42+
onLineLeave,
3743
onDataPointClick,
3844
onDataPointEnter,
3945
onDataPointLeave,
4046
ignoreValue,
4147
} = props;
4248

43-
const handleClick = useCallback(
44-
(evt: ThreeEvent<MouseEvent>) => {
45-
const { index } = evt;
46-
47-
if (onDataPointClick && index !== undefined) {
48-
onDataPointClick(index, evt);
49-
}
50-
},
51-
[onDataPointClick],
52-
);
53-
54-
const handlePointerEnter = useCallback(
55-
(evt: ThreeEvent<PointerEvent>) => {
56-
const { index } = evt;
57-
58-
if (onDataPointEnter && index !== undefined) {
59-
onDataPointEnter(index, evt);
60-
}
61-
},
62-
[onDataPointEnter],
63-
);
64-
65-
const handlePointerLeave = useCallback(
66-
(evt: ThreeEvent<PointerEvent>) => {
67-
const { index } = evt;
68-
69-
if (onDataPointLeave && index !== undefined) {
70-
onDataPointLeave(index, evt);
71-
}
72-
},
73-
[onDataPointLeave],
74-
);
75-
7649
return (
7750
<>
7851
<Line
@@ -81,6 +54,9 @@ function DataCurve(props: Props) {
8154
color={color}
8255
ignoreValue={ignoreValue}
8356
visible={curveType !== CurveType.GlyphsOnly && visible}
57+
onClick={useEventHandler(onLineClick)}
58+
onPointerEnter={useEventHandler(onLineEnter)}
59+
onPointerLeave={useEventHandler(onLineLeave)}
8460
/>
8561
<Glyphs
8662
abscissas={abscissas}
@@ -90,9 +66,9 @@ function DataCurve(props: Props) {
9066
size={glyphSize}
9167
ignoreValue={ignoreValue}
9268
visible={curveType !== CurveType.LineOnly && visible}
93-
onClick={onDataPointClick && handleClick}
94-
onPointerEnter={onDataPointEnter && handlePointerEnter}
95-
onPointerLeave={onDataPointLeave && handlePointerLeave}
69+
onClick={useEventHandler(onDataPointClick)}
70+
onPointerEnter={useEventHandler(onDataPointEnter)}
71+
onPointerLeave={useEventHandler(onDataPointLeave)}
9672
/>
9773
{errors && (
9874
<ErrorBars

packages/lib/src/vis/line/utils.ts

+17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { type NumArray } from '@h5web/shared/vis-models';
2+
import { type ThreeEvent } from '@react-three/fiber';
23
import { range } from 'd3-array';
4+
import { useMemo } from 'react';
35

46
export function getAxisValues(
57
rawValues: NumArray | undefined,
@@ -15,3 +17,18 @@ export function getAxisValues(
1517

1618
return rawValues.slice(0, axisLength);
1719
}
20+
21+
export function useEventHandler<T extends MouseEvent | PointerEvent>(
22+
handler: ((index: number, evt: ThreeEvent<T>) => void) | undefined,
23+
): ((evt: ThreeEvent<T>) => void) | undefined {
24+
return useMemo(() => {
25+
return (
26+
handler &&
27+
((evt: ThreeEvent<T>) => {
28+
if (evt.index !== undefined) {
29+
handler(evt.index, evt);
30+
}
31+
})
32+
);
33+
}, [handler]);
34+
}

0 commit comments

Comments
 (0)