@deepnoid/canvas 0.1.78 → 0.1.80

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.
Files changed (34) hide show
  1. package/README.md +19 -8
  2. package/dist/engine/annotation/annotationTypes.d.ts +12 -2
  3. package/dist/engine/annotation/annotationTypes.js +1 -2
  4. package/dist/engine/annotation/hitTest.d.ts +5 -0
  5. package/dist/engine/annotation/hitTest.js +63 -0
  6. package/dist/engine/annotation/polygon/polygonController.d.ts +34 -0
  7. package/dist/engine/annotation/polygon/polygonController.js +252 -0
  8. package/dist/engine/annotation/polygon/polygonHitTest.d.ts +6 -0
  9. package/dist/engine/annotation/polygon/polygonHitTest.js +84 -0
  10. package/dist/engine/annotation/polygon/polygonInteraction.d.ts +19 -0
  11. package/dist/engine/annotation/polygon/polygonInteraction.js +36 -0
  12. package/dist/engine/annotation/polygon/polygonMath.d.ts +7 -0
  13. package/dist/engine/annotation/polygon/polygonMath.js +47 -0
  14. package/dist/engine/annotation/polygon/polygonRenderer.d.ts +2 -0
  15. package/dist/engine/annotation/polygon/polygonRenderer.js +79 -0
  16. package/dist/engine/annotation/polygon/polygonTransform.d.ts +14 -0
  17. package/dist/engine/annotation/polygon/polygonTransform.js +68 -0
  18. package/dist/engine/annotation/polygon/polygonTypes.d.ts +9 -0
  19. package/dist/engine/annotation/polygon/polygonTypes.js +1 -0
  20. package/dist/engine/annotation/rectangle/rectangleController.js +8 -15
  21. package/dist/engine/annotation/rectangle/rectangleHitTest.js +5 -4
  22. package/dist/engine/annotation/rectangle/rectangleRenderer.js +8 -0
  23. package/dist/engine/annotation/rectangle/rectangleTransform.js +31 -28
  24. package/dist/engine/interaction/drawModeRouter.js +47 -27
  25. package/dist/engine/interaction/interactionController.d.ts +1 -0
  26. package/dist/engine/interaction/interactionController.js +17 -0
  27. package/dist/engine/interaction/interface.d.ts +1 -0
  28. package/dist/engine/interaction/pointerInteraction.js +7 -2
  29. package/dist/engine/public/annotationEngine.d.ts +3 -1
  30. package/dist/engine/public/annotationEngine.js +23 -2
  31. package/dist/react/AnnotationCanvas.js +6 -14
  32. package/dist/react/hooks/useHotkeys.d.ts +2 -1
  33. package/dist/react/hooks/useHotkeys.js +4 -2
  34. package/package.json +1 -1
@@ -33,6 +33,7 @@ const AnnotationCanvas = ({ image, annotations = [], setAnnotations, options, dr
33
33
  onDelete: () => engineRef.current?.deleteSelected(),
34
34
  toggleSelectionOnly: () => engineRef.current?.toggleShowSelectedOnly(),
35
35
  onUndoRedo: (isRedo) => engineRef.current?.undoRedo(isRedo),
36
+ onEscape: () => engineRef.current?.onKeyDown(new KeyboardEvent('keydown', { key: 'Escape' })),
36
37
  enabled: enableHotkeys,
37
38
  });
38
39
  /* ---------- Image / Engine lifecycle ---------- */
@@ -117,7 +118,6 @@ const AnnotationCanvas = ({ image, annotations = [], setAnnotations, options, dr
117
118
  engineRef.current = engine;
118
119
  imageLoadingRef.current = false;
119
120
  if (pendingAnnotationsRef.current && pendingAnnotationsRef.current.length > 0) {
120
- console.log('Applying pending annotations after image load:', pendingAnnotationsRef.current.length);
121
121
  engine.setAnnotations(pendingAnnotationsRef.current);
122
122
  engine.commitHistory();
123
123
  }
@@ -146,24 +146,12 @@ const AnnotationCanvas = ({ image, annotations = [], setAnnotations, options, dr
146
146
  }, [image, resetOnImageChange]);
147
147
  /* ---------- External annotations ---------- */
148
148
  useEffect(() => {
149
- console.log('External annotations effect:', {
150
- imageLoading: imageLoadingRef.current,
151
- hasEngine: !!engineRef.current,
152
- annotationsLength: annotations.length,
153
- pendingLength: pendingAnnotationsRef.current?.length,
154
- });
155
149
  if (imageLoadingRef.current || !engineRef.current) {
156
- console.log('Saving to pending annotations');
157
150
  pendingAnnotationsRef.current = annotations;
158
151
  return;
159
152
  }
160
153
  const before = engineRef.current.getAnnotations();
161
- console.log('Comparing annotations:', {
162
- before: before.length,
163
- after: annotations.length,
164
- });
165
154
  if (JSON.stringify(before) !== JSON.stringify(annotations)) {
166
- console.log('Setting new annotations to engine');
167
155
  engineRef.current.setAnnotations(annotations);
168
156
  engineRef.current.commitHistory();
169
157
  }
@@ -173,6 +161,10 @@ const AnnotationCanvas = ({ image, annotations = [], setAnnotations, options, dr
173
161
  useEffect(() => engineRef.current?.setEditable(editable), [editable]);
174
162
  useEffect(() => engineRef.current?.setDrawing(drawing), [drawing]);
175
163
  /* ---------- Render ---------- */
176
- return (_jsx("div", { ref: containerRef, style: { width: '100%', height: '100%', position: 'relative', flex: 1 }, onWheel: (e) => engineRef.current?.onWheel(e.nativeEvent), onMouseDown: (e) => engineRef.current?.onMouseDown(e.nativeEvent), onMouseMove: (e) => engineRef.current?.onMouseMove(e.nativeEvent), onMouseUp: (e) => engineRef.current?.onMouseUp(e.nativeEvent), onMouseLeave: (e) => engineRef.current?.onMouseLeave(e.nativeEvent), onContextMenu: (e) => e.preventDefault(), children: ZoomButton && (_jsx(ZoomButton, { onClick: () => engineRef.current?.initImageCanvas(true), children: engineRef.current?.getZoomRatioLabel() })) }));
164
+ return (_jsx("div", { ref: containerRef, style: { width: '100%', height: '100%', position: 'relative', flex: 1 }, onWheel: (e) => engineRef.current?.onWheel(e.nativeEvent), onMouseDown: (e) => engineRef.current?.onMouseDown(e.nativeEvent), onMouseMove: (e) => engineRef.current?.onMouseMove(e.nativeEvent), onMouseUp: (e) => engineRef.current?.onMouseUp(e.nativeEvent), onMouseLeave: (e) => engineRef.current?.onMouseLeave(e.nativeEvent), onContextMenu: (e) => e.preventDefault(), tabIndex: 0, onKeyDown: (e) => {
165
+ if (e.key === 'Escape' || e.code === 'Escape') {
166
+ engineRef.current?.onKeyDown(e.nativeEvent);
167
+ }
168
+ }, children: ZoomButton && (_jsx(ZoomButton, { onClick: () => engineRef.current?.initImageCanvas(true), children: engineRef.current?.getZoomRatioLabel() })) }));
177
169
  };
178
170
  export default AnnotationCanvas;
@@ -2,7 +2,8 @@ type Props = {
2
2
  onDelete: () => void;
3
3
  toggleSelectionOnly: () => void;
4
4
  onUndoRedo: (isRedo: boolean) => void;
5
+ onEscape?: () => void;
5
6
  enabled?: boolean;
6
7
  };
7
- export declare function useHotkeys({ onDelete, toggleSelectionOnly, onUndoRedo, enabled }: Props): void;
8
+ export declare function useHotkeys({ onDelete, toggleSelectionOnly, onUndoRedo, onEscape, enabled }: Props): void;
8
9
  export {};
@@ -1,5 +1,5 @@
1
1
  import { useEffect } from 'react';
2
- export function useHotkeys({ onDelete, toggleSelectionOnly, onUndoRedo, enabled = false }) {
2
+ export function useHotkeys({ onDelete, toggleSelectionOnly, onUndoRedo, onEscape, enabled = false }) {
3
3
  useEffect(() => {
4
4
  if (!enabled)
5
5
  return;
@@ -10,8 +10,10 @@ export function useHotkeys({ onDelete, toggleSelectionOnly, onUndoRedo, enabled
10
10
  toggleSelectionOnly();
11
11
  if (event.code === 'KeyZ' && (event.metaKey || event.ctrlKey))
12
12
  onUndoRedo(event.shiftKey);
13
+ if (event.key === 'Escape' || event.code === 'Escape')
14
+ onEscape?.();
13
15
  };
14
16
  window.addEventListener('keydown', handleKeyDown);
15
17
  return () => window.removeEventListener('keydown', handleKeyDown);
16
- }, [onDelete, toggleSelectionOnly, onUndoRedo, enabled]);
18
+ }, [onDelete, toggleSelectionOnly, onUndoRedo, onEscape, enabled]);
17
19
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepnoid/canvas",
3
- "version": "0.1.78",
3
+ "version": "0.1.80",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",