MCPcopy Create free account
hub / github.com/ChartGPU/ChartGPU / createInsideZoom

Function createInsideZoom

src/interaction/createInsideZoom.ts:68–199  ·  view source on GitHub ↗
(eventManager: EventManager, zoomState: ZoomState)

Source from the content-addressed store, hash-verified

66 * - shift+left drag OR middle-mouse drag pans left/right (only when inside grid)
67 */
68export function createInsideZoom(eventManager: EventManager, zoomState: ZoomState): InsideZoom {
69 let disposed = false;
70 let enabled = false;
71
72 let lastPointer: ChartGPUEventPayload | null = null;
73 let isPanning = false;
74 let lastPanGridX = 0;
75
76 const clearPan = (): void => {
77 isPanning = false;
78 lastPanGridX = 0;
79 };
80
81 const onMouseMove = (payload: ChartGPUEventPayload): void => {
82 lastPointer = payload;
83 if (!enabled) return;
84
85 // Pan only for mouse drags, only when inside grid.
86 const e = payload.originalEvent;
87 const shouldPan = payload.isInGrid && (isShiftLeftDrag(e) || isMiddleButtonDrag(e));
88
89 if (!shouldPan) {
90 clearPan();
91 return;
92 }
93
94 const plotWidthCss = payload.plotWidthCss;
95 if (!(plotWidthCss > 0) || !Number.isFinite(plotWidthCss)) {
96 clearPan();
97 return;
98 }
99
100 if (!isPanning) {
101 isPanning = true;
102 lastPanGridX = payload.gridX;
103 return;
104 }
105
106 const dxCss = payload.gridX - lastPanGridX;
107 lastPanGridX = payload.gridX;
108 if (!Number.isFinite(dxCss) || dxCss === 0) return;
109
110 const { start, end } = zoomState.getRange();
111 const span = end - start;
112 if (!Number.isFinite(span) || span === 0) return;
113
114 // Convert grid-local px to percent points *within the current window*.
115 // “Grab to pan” behavior: dragging right should move the window left (show earlier data).
116 const deltaPct = -(dxCss / plotWidthCss) * span;
117 if (!Number.isFinite(deltaPct) || deltaPct === 0) return;
118 zoomState.pan(deltaPct);
119 };
120
121 const onMouseLeave = (_payload: ChartGPUEventPayload): void => {
122 lastPointer = null;
123 clearPan();
124 };
125

Callers 1

updateZoomFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected