@docmentis/udoc-viewer 0.6.21 → 0.6.23
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/package.json +1 -1
- package/dist/src/UDocClient.d.ts +22 -0
- package/dist/src/UDocClient.d.ts.map +1 -1
- package/dist/src/UDocClient.js +25 -1
- package/dist/src/UDocClient.js.map +1 -1
- package/dist/src/UDocViewer.d.ts +4 -3
- package/dist/src/UDocViewer.d.ts.map +1 -1
- package/dist/src/UDocViewer.js +50 -3
- package/dist/src/UDocViewer.js.map +1 -1
- package/dist/src/ui/viewer/actions.d.ts +34 -3
- package/dist/src/ui/viewer/actions.d.ts.map +1 -1
- package/dist/src/ui/viewer/annotation/ShapeRenderer.d.ts.map +1 -1
- package/dist/src/ui/viewer/annotation/ShapeRenderer.js +23 -16
- package/dist/src/ui/viewer/annotation/ShapeRenderer.js.map +1 -1
- package/dist/src/ui/viewer/annotation/index.d.ts +1 -1
- package/dist/src/ui/viewer/annotation/index.d.ts.map +1 -1
- package/dist/src/ui/viewer/annotation/index.js +1 -1
- package/dist/src/ui/viewer/annotation/index.js.map +1 -1
- package/dist/src/ui/viewer/annotation/render.d.ts.map +1 -1
- package/dist/src/ui/viewer/annotation/render.js +11 -4
- package/dist/src/ui/viewer/annotation/render.js.map +1 -1
- package/dist/src/ui/viewer/annotation/types.d.ts +9 -1
- package/dist/src/ui/viewer/annotation/types.d.ts.map +1 -1
- package/dist/src/ui/viewer/annotation/utils.d.ts +10 -1
- package/dist/src/ui/viewer/annotation/utils.d.ts.map +1 -1
- package/dist/src/ui/viewer/annotation/utils.js +114 -0
- package/dist/src/ui/viewer/annotation/utils.js.map +1 -1
- package/dist/src/ui/viewer/components/ColorSelect.d.ts +26 -0
- package/dist/src/ui/viewer/components/ColorSelect.d.ts.map +1 -0
- package/dist/src/ui/viewer/components/ColorSelect.js +120 -0
- package/dist/src/ui/viewer/components/ColorSelect.js.map +1 -0
- package/dist/src/ui/viewer/components/FloatingToolbar.js +12 -12
- package/dist/src/ui/viewer/components/FloatingToolbar.js.map +1 -1
- package/dist/src/ui/viewer/components/NumberInput.d.ts +32 -0
- package/dist/src/ui/viewer/components/NumberInput.d.ts.map +1 -0
- package/dist/src/ui/viewer/components/NumberInput.js +101 -0
- package/dist/src/ui/viewer/components/NumberInput.js.map +1 -0
- package/dist/src/ui/viewer/components/Spread.d.ts +2 -2
- package/dist/src/ui/viewer/components/Spread.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/Spread.js.map +1 -1
- package/dist/src/ui/viewer/components/SubToolbar.d.ts +10 -0
- package/dist/src/ui/viewer/components/SubToolbar.d.ts.map +1 -0
- package/dist/src/ui/viewer/components/SubToolbar.js +481 -0
- package/dist/src/ui/viewer/components/SubToolbar.js.map +1 -0
- package/dist/src/ui/viewer/components/Toolbar.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/Toolbar.js +147 -4
- package/dist/src/ui/viewer/components/Toolbar.js.map +1 -1
- package/dist/src/ui/viewer/components/ViewModeMenu.js +3 -3
- package/dist/src/ui/viewer/components/ViewModeMenu.js.map +1 -1
- package/dist/src/ui/viewer/components/Viewport.d.ts.map +1 -1
- package/dist/src/ui/viewer/components/Viewport.js +40 -2
- package/dist/src/ui/viewer/components/Viewport.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ar.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ar.js +40 -0
- package/dist/src/ui/viewer/i18n/ar.js.map +1 -1
- package/dist/src/ui/viewer/i18n/de.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/de.js +40 -0
- package/dist/src/ui/viewer/i18n/de.js.map +1 -1
- package/dist/src/ui/viewer/i18n/en.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/en.js +40 -0
- package/dist/src/ui/viewer/i18n/en.js.map +1 -1
- package/dist/src/ui/viewer/i18n/es.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/es.js +40 -0
- package/dist/src/ui/viewer/i18n/es.js.map +1 -1
- package/dist/src/ui/viewer/i18n/fr.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/fr.js +40 -0
- package/dist/src/ui/viewer/i18n/fr.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ja.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ja.js +40 -0
- package/dist/src/ui/viewer/i18n/ja.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ko.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ko.js +40 -0
- package/dist/src/ui/viewer/i18n/ko.js.map +1 -1
- package/dist/src/ui/viewer/i18n/pt-BR.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/pt-BR.js +40 -0
- package/dist/src/ui/viewer/i18n/pt-BR.js.map +1 -1
- package/dist/src/ui/viewer/i18n/ru.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/ru.js +40 -0
- package/dist/src/ui/viewer/i18n/ru.js.map +1 -1
- package/dist/src/ui/viewer/i18n/types.d.ts +35 -0
- package/dist/src/ui/viewer/i18n/types.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-CN.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-CN.js +40 -0
- package/dist/src/ui/viewer/i18n/zh-CN.js.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-TW.d.ts.map +1 -1
- package/dist/src/ui/viewer/i18n/zh-TW.js +40 -0
- package/dist/src/ui/viewer/i18n/zh-TW.js.map +1 -1
- package/dist/src/ui/viewer/icons.d.ts +29 -0
- package/dist/src/ui/viewer/icons.d.ts.map +1 -1
- package/dist/src/ui/viewer/icons.js +42 -0
- package/dist/src/ui/viewer/icons.js.map +1 -1
- package/dist/src/ui/viewer/reducer.d.ts.map +1 -1
- package/dist/src/ui/viewer/reducer.js +109 -1
- package/dist/src/ui/viewer/reducer.js.map +1 -1
- package/dist/src/ui/viewer/search/search.d.ts +4 -4
- package/dist/src/ui/viewer/search/search.d.ts.map +1 -1
- package/dist/src/ui/viewer/search/search.js +1 -1
- package/dist/src/ui/viewer/search/search.js.map +1 -1
- package/dist/src/ui/viewer/shell.d.ts +2 -2
- package/dist/src/ui/viewer/shell.d.ts.map +1 -1
- package/dist/src/ui/viewer/shell.js +13 -2
- package/dist/src/ui/viewer/shell.js.map +1 -1
- package/dist/src/ui/viewer/state.d.ts +55 -2
- package/dist/src/ui/viewer/state.d.ts.map +1 -1
- package/dist/src/ui/viewer/state.js +30 -0
- package/dist/src/ui/viewer/state.js.map +1 -1
- package/dist/src/ui/viewer/styles-inline.d.ts +1 -1
- package/dist/src/ui/viewer/styles-inline.d.ts.map +1 -1
- package/dist/src/ui/viewer/styles-inline.js +875 -246
- package/dist/src/ui/viewer/styles-inline.js.map +1 -1
- package/dist/src/ui/viewer/text/render.d.ts +3 -3
- package/dist/src/ui/viewer/text/render.d.ts.map +1 -1
- package/dist/src/ui/viewer/text/render.js +2 -2
- package/dist/src/ui/viewer/text/render.js.map +1 -1
- package/dist/src/ui/viewer/tools/AnnotationDrawController.d.ts +21 -0
- package/dist/src/ui/viewer/tools/AnnotationDrawController.d.ts.map +1 -0
- package/dist/src/ui/viewer/tools/AnnotationDrawController.js +392 -0
- package/dist/src/ui/viewer/tools/AnnotationDrawController.js.map +1 -0
- package/dist/src/ui/viewer/tools/AnnotationSelectController.d.ts +22 -0
- package/dist/src/ui/viewer/tools/AnnotationSelectController.d.ts.map +1 -0
- package/dist/src/ui/viewer/tools/AnnotationSelectController.js +367 -0
- package/dist/src/ui/viewer/tools/AnnotationSelectController.js.map +1 -0
- package/dist/src/ui/viewer/tools/ViewToolController.d.ts +20 -0
- package/dist/src/ui/viewer/tools/ViewToolController.d.ts.map +1 -0
- package/dist/src/ui/viewer/tools/ViewToolController.js +194 -0
- package/dist/src/ui/viewer/tools/ViewToolController.js.map +1 -0
- package/dist/src/wasm/udoc.d.ts +399 -114
- package/dist/src/wasm/udoc.js +157 -81
- package/dist/src/wasm/udoc_bg.wasm +0 -0
- package/dist/src/wasm/udoc_bg.wasm.d.ts +8 -7
- package/dist/src/worker/WorkerClient.d.ts +17 -11
- package/dist/src/worker/WorkerClient.d.ts.map +1 -1
- package/dist/src/worker/WorkerClient.js +10 -2
- package/dist/src/worker/WorkerClient.js.map +1 -1
- package/dist/src/worker/index.d.ts +1 -1
- package/dist/src/worker/index.d.ts.map +1 -1
- package/dist/src/worker/worker-inline.js +1 -1
- package/dist/src/worker/worker.d.ts +26 -58
- package/dist/src/worker/worker.d.ts.map +1 -1
- package/dist/src/worker/worker.js +161 -80
- package/dist/src/worker/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnnotationSelectController — handles annotation selection, move, resize, and deletion.
|
|
3
|
+
*
|
|
4
|
+
* When the "select" sub-tool is active (in either annotate or markup tool sets):
|
|
5
|
+
* - Clicking an annotation selects it, showing a bounding box with resize handles.
|
|
6
|
+
* - Dragging the bounding box moves the annotation.
|
|
7
|
+
* - Dragging a resize handle resizes the annotation.
|
|
8
|
+
* - Pressing Delete/Backspace removes the selected annotation.
|
|
9
|
+
* - Clicking empty space deselects.
|
|
10
|
+
*/
|
|
11
|
+
import { getPointsToPixels, isToolSet, ANNOTATION_FORMATS } from "../state";
|
|
12
|
+
import { offsetAnnotation, resizeAnnotation } from "../annotation/utils";
|
|
13
|
+
const SELECT_CURSOR_CLASS = "udoc-viewer--tool-select";
|
|
14
|
+
const MOVING_CLASS = "udoc-viewer--annotation-moving";
|
|
15
|
+
const RESIZING_CLASS = "udoc-viewer--annotation-resizing";
|
|
16
|
+
const BBOX_CLASS = "udoc-annotation-select-bbox";
|
|
17
|
+
const HANDLE_POSITIONS = ["nw", "n", "ne", "e", "se", "s", "sw", "w"];
|
|
18
|
+
const HANDLE_CURSORS = {
|
|
19
|
+
nw: "nwse-resize",
|
|
20
|
+
n: "ns-resize",
|
|
21
|
+
ne: "nesw-resize",
|
|
22
|
+
e: "ew-resize",
|
|
23
|
+
se: "nwse-resize",
|
|
24
|
+
s: "ns-resize",
|
|
25
|
+
sw: "nesw-resize",
|
|
26
|
+
w: "ew-resize",
|
|
27
|
+
};
|
|
28
|
+
export function createAnnotationSelectController(options) {
|
|
29
|
+
const { scrollArea, viewerRoot, store } = options;
|
|
30
|
+
let active = false;
|
|
31
|
+
let bboxEl = null;
|
|
32
|
+
let innerEl = null;
|
|
33
|
+
let isDragging = false;
|
|
34
|
+
let dragMode = "move";
|
|
35
|
+
let dragScale = 1;
|
|
36
|
+
let dragStartX = 0;
|
|
37
|
+
let dragStartY = 0;
|
|
38
|
+
let dragDx = 0;
|
|
39
|
+
let dragDy = 0;
|
|
40
|
+
let dragAnnotationPageIndex = -1;
|
|
41
|
+
let dragAnnotationIndex = -1;
|
|
42
|
+
/** Original bounds at drag start (for resize) */
|
|
43
|
+
let dragOriginalBounds = { x: 0, y: 0, width: 0, height: 0 };
|
|
44
|
+
/** Which handle is being dragged (for resize) */
|
|
45
|
+
let dragHandle = "se";
|
|
46
|
+
// =========================================================================
|
|
47
|
+
// Bounding box with handles
|
|
48
|
+
// =========================================================================
|
|
49
|
+
function removeBbox() {
|
|
50
|
+
if (bboxEl) {
|
|
51
|
+
bboxEl.remove();
|
|
52
|
+
bboxEl = null;
|
|
53
|
+
innerEl = null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function updateSelectionVisual() {
|
|
57
|
+
removeBbox();
|
|
58
|
+
const state = store.getState();
|
|
59
|
+
const sel = state.selectedAnnotation;
|
|
60
|
+
if (!sel)
|
|
61
|
+
return;
|
|
62
|
+
const annotations = state.pageAnnotations.get(sel.pageIndex);
|
|
63
|
+
if (!annotations || sel.annotationIndex >= annotations.length)
|
|
64
|
+
return;
|
|
65
|
+
const annotation = annotations[sel.annotationIndex];
|
|
66
|
+
const bounds = annotation.bounds;
|
|
67
|
+
if (!bounds || (bounds.width === 0 && bounds.height === 0))
|
|
68
|
+
return;
|
|
69
|
+
const pageNum = sel.pageIndex + 1;
|
|
70
|
+
const slot = scrollArea.querySelector(`[data-page="${pageNum}"]`);
|
|
71
|
+
if (!slot)
|
|
72
|
+
return;
|
|
73
|
+
const annotationLayer = slot.querySelector(".udoc-spread__annotation-layer");
|
|
74
|
+
if (!annotationLayer)
|
|
75
|
+
return;
|
|
76
|
+
const pointsToPixels = getPointsToPixels(state.dpi);
|
|
77
|
+
const zoom = state.effectiveZoom ?? state.zoom;
|
|
78
|
+
const scale = pointsToPixels * zoom;
|
|
79
|
+
// Outer wrapper — copies annotation layer positioning
|
|
80
|
+
bboxEl = document.createElement("div");
|
|
81
|
+
bboxEl.className = BBOX_CLASS;
|
|
82
|
+
bboxEl.style.position = "absolute";
|
|
83
|
+
bboxEl.style.width = annotationLayer.style.width;
|
|
84
|
+
bboxEl.style.height = annotationLayer.style.height;
|
|
85
|
+
bboxEl.style.left = annotationLayer.style.left;
|
|
86
|
+
bboxEl.style.top = annotationLayer.style.top;
|
|
87
|
+
bboxEl.style.transform = annotationLayer.style.transform;
|
|
88
|
+
bboxEl.style.transformOrigin = "center";
|
|
89
|
+
// Inner — the actual bounding rectangle
|
|
90
|
+
innerEl = document.createElement("div");
|
|
91
|
+
innerEl.className = BBOX_CLASS + "__inner";
|
|
92
|
+
innerEl.style.position = "absolute";
|
|
93
|
+
innerEl.style.left = `${bounds.x * scale}px`;
|
|
94
|
+
innerEl.style.top = `${bounds.y * scale}px`;
|
|
95
|
+
innerEl.style.width = `${bounds.width * scale}px`;
|
|
96
|
+
innerEl.style.height = `${bounds.height * scale}px`;
|
|
97
|
+
// Resize handles
|
|
98
|
+
for (const pos of HANDLE_POSITIONS) {
|
|
99
|
+
const handle = document.createElement("div");
|
|
100
|
+
handle.className = `${BBOX_CLASS}__handle ${BBOX_CLASS}__handle--${pos}`;
|
|
101
|
+
handle.style.cursor = HANDLE_CURSORS[pos];
|
|
102
|
+
handle.dataset.handle = pos;
|
|
103
|
+
innerEl.appendChild(handle);
|
|
104
|
+
}
|
|
105
|
+
bboxEl.appendChild(innerEl);
|
|
106
|
+
slot.appendChild(bboxEl);
|
|
107
|
+
}
|
|
108
|
+
/** Update inner element position/size during drag preview. */
|
|
109
|
+
function updateInnerPreview(bounds, newBounds) {
|
|
110
|
+
if (!innerEl)
|
|
111
|
+
return;
|
|
112
|
+
innerEl.style.left = `${newBounds.x * dragScale}px`;
|
|
113
|
+
innerEl.style.top = `${newBounds.y * dragScale}px`;
|
|
114
|
+
innerEl.style.width = `${newBounds.width * dragScale}px`;
|
|
115
|
+
innerEl.style.height = `${newBounds.height * dragScale}px`;
|
|
116
|
+
}
|
|
117
|
+
// =========================================================================
|
|
118
|
+
// Resize bounds computation
|
|
119
|
+
// =========================================================================
|
|
120
|
+
/** Compute new bounds from dragging a resize handle. */
|
|
121
|
+
function computeResizedBounds(original, handle, dx, dy) {
|
|
122
|
+
let { x, y, width, height } = original;
|
|
123
|
+
// Adjust edges based on handle
|
|
124
|
+
if (handle.includes("w")) {
|
|
125
|
+
x += dx;
|
|
126
|
+
width -= dx;
|
|
127
|
+
}
|
|
128
|
+
if (handle.includes("e") || handle === "e") {
|
|
129
|
+
width += dx;
|
|
130
|
+
}
|
|
131
|
+
if (handle.includes("n") && handle !== "ne" && handle !== "nw") {
|
|
132
|
+
// "n" only
|
|
133
|
+
y += dy;
|
|
134
|
+
height -= dy;
|
|
135
|
+
}
|
|
136
|
+
if (handle === "nw" || handle === "n" || handle === "ne") {
|
|
137
|
+
y += dy;
|
|
138
|
+
height -= dy;
|
|
139
|
+
}
|
|
140
|
+
if (handle === "sw" || handle === "s" || handle === "se") {
|
|
141
|
+
height += dy;
|
|
142
|
+
}
|
|
143
|
+
// Enforce minimum size and flip if dragged past opposite edge
|
|
144
|
+
const MIN = 2;
|
|
145
|
+
if (width < MIN) {
|
|
146
|
+
x = x + width - MIN;
|
|
147
|
+
width = MIN;
|
|
148
|
+
}
|
|
149
|
+
if (height < MIN) {
|
|
150
|
+
y = y + height - MIN;
|
|
151
|
+
height = MIN;
|
|
152
|
+
}
|
|
153
|
+
return { x, y, width, height };
|
|
154
|
+
}
|
|
155
|
+
// =========================================================================
|
|
156
|
+
// Pointer events
|
|
157
|
+
// =========================================================================
|
|
158
|
+
function onPointerDown(e) {
|
|
159
|
+
if (e.button !== 0)
|
|
160
|
+
return;
|
|
161
|
+
const target = e.target;
|
|
162
|
+
// Check if clicking a resize handle
|
|
163
|
+
const handleEl = target.closest(`[data-handle]`);
|
|
164
|
+
if (handleEl && bboxEl?.contains(handleEl)) {
|
|
165
|
+
const sel = store.getState().selectedAnnotation;
|
|
166
|
+
if (sel) {
|
|
167
|
+
const slotEl = bboxEl.closest("[data-page]");
|
|
168
|
+
if (slotEl) {
|
|
169
|
+
startDrag(e, sel.pageIndex, sel.annotationIndex, "resize", handleEl.dataset.handle);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Check if clicking on an annotation
|
|
175
|
+
const annotationEl = target.closest("[data-annotation-index]");
|
|
176
|
+
if (annotationEl) {
|
|
177
|
+
const slotEl = annotationEl.closest("[data-page]");
|
|
178
|
+
if (!slotEl)
|
|
179
|
+
return;
|
|
180
|
+
const pageNum = parseInt(slotEl.dataset.page, 10);
|
|
181
|
+
if (isNaN(pageNum))
|
|
182
|
+
return;
|
|
183
|
+
const annotationIndex = parseInt(annotationEl.getAttribute("data-annotation-index"), 10);
|
|
184
|
+
if (isNaN(annotationIndex))
|
|
185
|
+
return;
|
|
186
|
+
const pageIndex = pageNum - 1;
|
|
187
|
+
const sel = store.getState().selectedAnnotation;
|
|
188
|
+
if (sel && sel.pageIndex === pageIndex && sel.annotationIndex === annotationIndex) {
|
|
189
|
+
startDrag(e, pageIndex, annotationIndex, "move");
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
store.dispatch({ type: "SELECT_ANNOTATION", pageIndex, annotationIndex });
|
|
193
|
+
e.preventDefault();
|
|
194
|
+
e.stopPropagation();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Check if clicking on the bbox inner (for move)
|
|
198
|
+
if (innerEl && (target === innerEl || innerEl.contains(target))) {
|
|
199
|
+
const sel = store.getState().selectedAnnotation;
|
|
200
|
+
if (sel) {
|
|
201
|
+
startDrag(e, sel.pageIndex, sel.annotationIndex, "move");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Clicked outside — deselect
|
|
206
|
+
store.dispatch({ type: "DESELECT_ANNOTATION" });
|
|
207
|
+
}
|
|
208
|
+
function startDrag(e, pageIndex, annotationIndex, mode, handle) {
|
|
209
|
+
const state = store.getState();
|
|
210
|
+
const pointsToPixels = getPointsToPixels(state.dpi);
|
|
211
|
+
const zoom = state.effectiveZoom ?? state.zoom;
|
|
212
|
+
const annotations = state.pageAnnotations.get(pageIndex);
|
|
213
|
+
if (!annotations || annotationIndex >= annotations.length)
|
|
214
|
+
return;
|
|
215
|
+
isDragging = true;
|
|
216
|
+
dragMode = mode;
|
|
217
|
+
dragScale = pointsToPixels * zoom;
|
|
218
|
+
dragStartX = e.clientX;
|
|
219
|
+
dragStartY = e.clientY;
|
|
220
|
+
dragDx = 0;
|
|
221
|
+
dragDy = 0;
|
|
222
|
+
dragAnnotationPageIndex = pageIndex;
|
|
223
|
+
dragAnnotationIndex = annotationIndex;
|
|
224
|
+
dragOriginalBounds = { ...annotations[annotationIndex].bounds };
|
|
225
|
+
dragHandle = handle ?? "se";
|
|
226
|
+
viewerRoot.classList.add(mode === "move" ? MOVING_CLASS : RESIZING_CLASS);
|
|
227
|
+
if (mode === "resize") {
|
|
228
|
+
viewerRoot.style.cursor = HANDLE_CURSORS[dragHandle];
|
|
229
|
+
}
|
|
230
|
+
scrollArea.setPointerCapture(e.pointerId);
|
|
231
|
+
e.preventDefault();
|
|
232
|
+
e.stopPropagation();
|
|
233
|
+
}
|
|
234
|
+
function onPointerMove(e) {
|
|
235
|
+
if (!isDragging)
|
|
236
|
+
return;
|
|
237
|
+
const pxDx = e.clientX - dragStartX;
|
|
238
|
+
const pxDy = e.clientY - dragStartY;
|
|
239
|
+
dragDx = pxDx / dragScale;
|
|
240
|
+
dragDy = pxDy / dragScale;
|
|
241
|
+
if (dragMode === "move") {
|
|
242
|
+
if (innerEl) {
|
|
243
|
+
const b = dragOriginalBounds;
|
|
244
|
+
updateInnerPreview(b, { x: b.x + dragDx, y: b.y + dragDy, width: b.width, height: b.height });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// Resize preview
|
|
249
|
+
const newBounds = computeResizedBounds(dragOriginalBounds, dragHandle, dragDx, dragDy);
|
|
250
|
+
updateInnerPreview(dragOriginalBounds, newBounds);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function onPointerUp(e) {
|
|
254
|
+
if (!isDragging)
|
|
255
|
+
return;
|
|
256
|
+
scrollArea.releasePointerCapture(e.pointerId);
|
|
257
|
+
viewerRoot.classList.remove(MOVING_CLASS);
|
|
258
|
+
viewerRoot.classList.remove(RESIZING_CLASS);
|
|
259
|
+
viewerRoot.style.cursor = "";
|
|
260
|
+
isDragging = false;
|
|
261
|
+
// Check for meaningful movement
|
|
262
|
+
if (Math.abs(dragDx) < 0.5 && Math.abs(dragDy) < 0.5) {
|
|
263
|
+
updateSelectionVisual();
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const state = store.getState();
|
|
267
|
+
const annotations = state.pageAnnotations.get(dragAnnotationPageIndex);
|
|
268
|
+
if (!annotations || dragAnnotationIndex >= annotations.length)
|
|
269
|
+
return;
|
|
270
|
+
const original = annotations[dragAnnotationIndex];
|
|
271
|
+
let updated;
|
|
272
|
+
if (dragMode === "move") {
|
|
273
|
+
updated = offsetAnnotation(original, dragDx, dragDy);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
const newBounds = computeResizedBounds(dragOriginalBounds, dragHandle, dragDx, dragDy);
|
|
277
|
+
updated = resizeAnnotation(original, newBounds);
|
|
278
|
+
}
|
|
279
|
+
store.dispatch({
|
|
280
|
+
type: "UPDATE_ANNOTATION",
|
|
281
|
+
pageIndex: dragAnnotationPageIndex,
|
|
282
|
+
annotationIndex: dragAnnotationIndex,
|
|
283
|
+
annotation: updated,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
function onPointerCancel(e) {
|
|
287
|
+
if (!isDragging)
|
|
288
|
+
return;
|
|
289
|
+
scrollArea.releasePointerCapture(e.pointerId);
|
|
290
|
+
viewerRoot.classList.remove(MOVING_CLASS);
|
|
291
|
+
viewerRoot.classList.remove(RESIZING_CLASS);
|
|
292
|
+
viewerRoot.style.cursor = "";
|
|
293
|
+
isDragging = false;
|
|
294
|
+
updateSelectionVisual();
|
|
295
|
+
}
|
|
296
|
+
// =========================================================================
|
|
297
|
+
// Keyboard
|
|
298
|
+
// =========================================================================
|
|
299
|
+
function onKeyDown(e) {
|
|
300
|
+
if (e.key !== "Delete" && e.key !== "Backspace")
|
|
301
|
+
return;
|
|
302
|
+
const tag = e.target.tagName;
|
|
303
|
+
if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT")
|
|
304
|
+
return;
|
|
305
|
+
const sel = store.getState().selectedAnnotation;
|
|
306
|
+
if (!sel)
|
|
307
|
+
return;
|
|
308
|
+
store.dispatch({ type: "REMOVE_ANNOTATION", pageIndex: sel.pageIndex, annotationIndex: sel.annotationIndex });
|
|
309
|
+
e.preventDefault();
|
|
310
|
+
}
|
|
311
|
+
// =========================================================================
|
|
312
|
+
// Activate / deactivate
|
|
313
|
+
// =========================================================================
|
|
314
|
+
function activate() {
|
|
315
|
+
if (active)
|
|
316
|
+
return;
|
|
317
|
+
active = true;
|
|
318
|
+
viewerRoot.classList.add(SELECT_CURSOR_CLASS);
|
|
319
|
+
scrollArea.addEventListener("pointerdown", onPointerDown);
|
|
320
|
+
scrollArea.addEventListener("pointermove", onPointerMove);
|
|
321
|
+
scrollArea.addEventListener("pointerup", onPointerUp);
|
|
322
|
+
scrollArea.addEventListener("pointercancel", onPointerCancel);
|
|
323
|
+
document.addEventListener("keydown", onKeyDown);
|
|
324
|
+
}
|
|
325
|
+
function deactivate() {
|
|
326
|
+
if (!active)
|
|
327
|
+
return;
|
|
328
|
+
active = false;
|
|
329
|
+
viewerRoot.classList.remove(SELECT_CURSOR_CLASS);
|
|
330
|
+
viewerRoot.classList.remove(MOVING_CLASS);
|
|
331
|
+
viewerRoot.classList.remove(RESIZING_CLASS);
|
|
332
|
+
viewerRoot.style.cursor = "";
|
|
333
|
+
scrollArea.removeEventListener("pointerdown", onPointerDown);
|
|
334
|
+
scrollArea.removeEventListener("pointermove", onPointerMove);
|
|
335
|
+
scrollArea.removeEventListener("pointerup", onPointerUp);
|
|
336
|
+
scrollArea.removeEventListener("pointercancel", onPointerCancel);
|
|
337
|
+
document.removeEventListener("keydown", onKeyDown);
|
|
338
|
+
removeBbox();
|
|
339
|
+
isDragging = false;
|
|
340
|
+
}
|
|
341
|
+
function isSelectMode(s) {
|
|
342
|
+
return (s.documentFormat !== null &&
|
|
343
|
+
ANNOTATION_FORMATS.has(s.documentFormat) &&
|
|
344
|
+
isToolSet(s.activeTool) &&
|
|
345
|
+
s.activeSubTool === "select");
|
|
346
|
+
}
|
|
347
|
+
const unsub = store.subscribeRender((_prev, next) => {
|
|
348
|
+
if (isSelectMode(next)) {
|
|
349
|
+
activate();
|
|
350
|
+
if (!isDragging) {
|
|
351
|
+
updateSelectionVisual();
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
deactivate();
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
if (isSelectMode(store.getState())) {
|
|
359
|
+
activate();
|
|
360
|
+
}
|
|
361
|
+
function destroy() {
|
|
362
|
+
unsub();
|
|
363
|
+
deactivate();
|
|
364
|
+
}
|
|
365
|
+
return { destroy };
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=AnnotationSelectController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnnotationSelectController.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/tools/AnnotationSelectController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ViewToolController — handles pointer, hand (pan), and zoom tool interactions.
|
|
3
|
+
*
|
|
4
|
+
* Attaches to the viewport scroll area and manages cursor styles and
|
|
5
|
+
* mouse/pointer events based on the currently active tool.
|
|
6
|
+
*/
|
|
7
|
+
import type { Store } from "../../framework/store";
|
|
8
|
+
import type { ViewerState } from "../state";
|
|
9
|
+
import type { Action } from "../actions";
|
|
10
|
+
export interface ViewToolControllerOptions {
|
|
11
|
+
/** The scroll container element (overflow: auto) */
|
|
12
|
+
scrollArea: HTMLElement;
|
|
13
|
+
/** The viewer root element (for applying cursor classes) */
|
|
14
|
+
viewerRoot: HTMLElement;
|
|
15
|
+
store: Store<ViewerState, Action>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createViewToolController(options: ViewToolControllerOptions): {
|
|
18
|
+
destroy: () => void;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=ViewToolController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewToolController.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/tools/ViewToolController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,yBAAyB;IACtC,oDAAoD;IACpD,UAAU,EAAE,WAAW,CAAC;IACxB,4DAA4D;IAC5D,UAAU,EAAE,WAAW,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;CACrC;AAWD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB;mBAoMnD,IAAI;EAU3B"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ViewToolController — handles pointer, hand (pan), and zoom tool interactions.
|
|
3
|
+
*
|
|
4
|
+
* Attaches to the viewport scroll area and manages cursor styles and
|
|
5
|
+
* mouse/pointer events based on the currently active tool.
|
|
6
|
+
*/
|
|
7
|
+
/** CSS class applied to viewer root for each tool cursor */
|
|
8
|
+
const CURSOR_CLASSES = {
|
|
9
|
+
pointer: "",
|
|
10
|
+
hand: "udoc-viewer--tool-hand",
|
|
11
|
+
zoom: "udoc-viewer--tool-zoom",
|
|
12
|
+
};
|
|
13
|
+
const HAND_GRABBING_CLASS = "udoc-viewer--tool-hand-grabbing";
|
|
14
|
+
export function createViewToolController(options) {
|
|
15
|
+
const { scrollArea, viewerRoot, store } = options;
|
|
16
|
+
let currentTool = "pointer";
|
|
17
|
+
let cleanupFn = null;
|
|
18
|
+
// --- Hand tool (drag to pan) ---
|
|
19
|
+
function attachHandTool() {
|
|
20
|
+
let isDragging = false;
|
|
21
|
+
let startX = 0;
|
|
22
|
+
let startY = 0;
|
|
23
|
+
let startScrollLeft = 0;
|
|
24
|
+
let startScrollTop = 0;
|
|
25
|
+
const onPointerDown = (e) => {
|
|
26
|
+
// Only primary button
|
|
27
|
+
if (e.button !== 0)
|
|
28
|
+
return;
|
|
29
|
+
// Don't interfere with interactive elements
|
|
30
|
+
const target = e.target;
|
|
31
|
+
if (target.closest("a, button, input, [role=button]"))
|
|
32
|
+
return;
|
|
33
|
+
isDragging = true;
|
|
34
|
+
startX = e.clientX;
|
|
35
|
+
startY = e.clientY;
|
|
36
|
+
startScrollLeft = scrollArea.scrollLeft;
|
|
37
|
+
startScrollTop = scrollArea.scrollTop;
|
|
38
|
+
viewerRoot.classList.add(HAND_GRABBING_CLASS);
|
|
39
|
+
scrollArea.setPointerCapture(e.pointerId);
|
|
40
|
+
e.preventDefault();
|
|
41
|
+
};
|
|
42
|
+
const onPointerMove = (e) => {
|
|
43
|
+
if (!isDragging)
|
|
44
|
+
return;
|
|
45
|
+
const dx = e.clientX - startX;
|
|
46
|
+
const dy = e.clientY - startY;
|
|
47
|
+
scrollArea.scrollLeft = startScrollLeft - dx;
|
|
48
|
+
scrollArea.scrollTop = startScrollTop - dy;
|
|
49
|
+
};
|
|
50
|
+
const onPointerUp = (e) => {
|
|
51
|
+
if (!isDragging)
|
|
52
|
+
return;
|
|
53
|
+
isDragging = false;
|
|
54
|
+
viewerRoot.classList.remove(HAND_GRABBING_CLASS);
|
|
55
|
+
scrollArea.releasePointerCapture(e.pointerId);
|
|
56
|
+
};
|
|
57
|
+
scrollArea.addEventListener("pointerdown", onPointerDown);
|
|
58
|
+
scrollArea.addEventListener("pointermove", onPointerMove);
|
|
59
|
+
scrollArea.addEventListener("pointerup", onPointerUp);
|
|
60
|
+
scrollArea.addEventListener("pointercancel", onPointerUp);
|
|
61
|
+
return () => {
|
|
62
|
+
scrollArea.removeEventListener("pointerdown", onPointerDown);
|
|
63
|
+
scrollArea.removeEventListener("pointermove", onPointerMove);
|
|
64
|
+
scrollArea.removeEventListener("pointerup", onPointerUp);
|
|
65
|
+
scrollArea.removeEventListener("pointercancel", onPointerUp);
|
|
66
|
+
viewerRoot.classList.remove(HAND_GRABBING_CLASS);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// --- Zoom tool (click to zoom in, alt+click to zoom out) ---
|
|
70
|
+
function attachZoomTool() {
|
|
71
|
+
const ZOOM_OUT_CLASS = "udoc-viewer--tool-zoom-out";
|
|
72
|
+
const updateZoomCursor = (e) => {
|
|
73
|
+
const out = e.altKey || e.shiftKey;
|
|
74
|
+
viewerRoot.classList.toggle(ZOOM_OUT_CLASS, out);
|
|
75
|
+
};
|
|
76
|
+
const onKeyDown = (e) => updateZoomCursor(e);
|
|
77
|
+
const onKeyUp = (e) => updateZoomCursor(e);
|
|
78
|
+
document.addEventListener("keydown", onKeyDown);
|
|
79
|
+
document.addEventListener("keyup", onKeyUp);
|
|
80
|
+
const onClick = (e) => {
|
|
81
|
+
// Don't interfere with interactive elements
|
|
82
|
+
const target = e.target;
|
|
83
|
+
if (target.closest("a, button, input, [role=button]"))
|
|
84
|
+
return;
|
|
85
|
+
const rect = scrollArea.getBoundingClientRect();
|
|
86
|
+
// Viewport-relative click position (0-1 range)
|
|
87
|
+
const viewX = (e.clientX - rect.left) / rect.width;
|
|
88
|
+
const viewY = (e.clientY - rect.top) / rect.height;
|
|
89
|
+
// Scroll position before zoom
|
|
90
|
+
const prevScrollLeft = scrollArea.scrollLeft;
|
|
91
|
+
const prevScrollTop = scrollArea.scrollTop;
|
|
92
|
+
const prevScrollWidth = scrollArea.scrollWidth;
|
|
93
|
+
const prevScrollHeight = scrollArea.scrollHeight;
|
|
94
|
+
// Alt/Shift+click = zoom out, normal click = zoom in
|
|
95
|
+
if (e.altKey || e.shiftKey) {
|
|
96
|
+
store.dispatch({ type: "ZOOM_OUT" });
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
store.dispatch({ type: "ZOOM_IN" });
|
|
100
|
+
}
|
|
101
|
+
// After zoom dispatched, schedule scroll adjustment to keep click point stable.
|
|
102
|
+
// We use requestAnimationFrame because the layout needs to update first.
|
|
103
|
+
requestAnimationFrame(() => {
|
|
104
|
+
const newScrollWidth = scrollArea.scrollWidth;
|
|
105
|
+
const newScrollHeight = scrollArea.scrollHeight;
|
|
106
|
+
if (prevScrollWidth === 0 || prevScrollHeight === 0)
|
|
107
|
+
return;
|
|
108
|
+
const scaleX = newScrollWidth / prevScrollWidth;
|
|
109
|
+
const scaleY = newScrollHeight / prevScrollHeight;
|
|
110
|
+
// The point under the cursor in the old scroll space
|
|
111
|
+
const pointX = prevScrollLeft + viewX * rect.width;
|
|
112
|
+
const pointY = prevScrollTop + viewY * rect.height;
|
|
113
|
+
// Where that same point is in the new scroll space
|
|
114
|
+
const newPointX = pointX * scaleX;
|
|
115
|
+
const newPointY = pointY * scaleY;
|
|
116
|
+
// Adjust scroll so the point stays under the cursor
|
|
117
|
+
scrollArea.scrollLeft = newPointX - viewX * rect.width;
|
|
118
|
+
scrollArea.scrollTop = newPointY - viewY * rect.height;
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
scrollArea.addEventListener("click", onClick);
|
|
122
|
+
return () => {
|
|
123
|
+
scrollArea.removeEventListener("click", onClick);
|
|
124
|
+
document.removeEventListener("keydown", onKeyDown);
|
|
125
|
+
document.removeEventListener("keyup", onKeyUp);
|
|
126
|
+
viewerRoot.classList.remove(ZOOM_OUT_CLASS);
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// --- Cursor and tool switching ---
|
|
130
|
+
function setCursorClass(tool) {
|
|
131
|
+
// Remove all tool cursor classes
|
|
132
|
+
for (const cls of Object.values(CURSOR_CLASSES)) {
|
|
133
|
+
if (cls)
|
|
134
|
+
viewerRoot.classList.remove(cls);
|
|
135
|
+
}
|
|
136
|
+
viewerRoot.classList.remove(HAND_GRABBING_CLASS);
|
|
137
|
+
// Add new one
|
|
138
|
+
const cls = CURSOR_CLASSES[tool];
|
|
139
|
+
if (cls)
|
|
140
|
+
viewerRoot.classList.add(cls);
|
|
141
|
+
}
|
|
142
|
+
function switchTool(tool) {
|
|
143
|
+
if (tool === currentTool)
|
|
144
|
+
return;
|
|
145
|
+
// Teardown previous tool
|
|
146
|
+
if (cleanupFn) {
|
|
147
|
+
cleanupFn();
|
|
148
|
+
cleanupFn = null;
|
|
149
|
+
}
|
|
150
|
+
currentTool = tool;
|
|
151
|
+
setCursorClass(tool);
|
|
152
|
+
// Setup new tool
|
|
153
|
+
switch (tool) {
|
|
154
|
+
case "hand":
|
|
155
|
+
cleanupFn = attachHandTool();
|
|
156
|
+
break;
|
|
157
|
+
case "zoom":
|
|
158
|
+
cleanupFn = attachZoomTool();
|
|
159
|
+
break;
|
|
160
|
+
// "pointer" — default behavior, no extra handlers needed
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Subscribe to tool state changes
|
|
164
|
+
let prevTool = store.getState().activeTool;
|
|
165
|
+
const unsub = store.subscribeRender((_prev, next) => {
|
|
166
|
+
const tool = next.activeTool;
|
|
167
|
+
if (tool !== prevTool) {
|
|
168
|
+
prevTool = tool;
|
|
169
|
+
// Only handle view tools; tool sets don't affect viewport interaction
|
|
170
|
+
if (tool === "pointer" || tool === "hand" || tool === "zoom") {
|
|
171
|
+
switchTool(tool);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// For annotation/markup tool sets, revert to pointer behavior
|
|
175
|
+
switchTool("pointer");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
// Apply initial state
|
|
180
|
+
const initial = store.getState().activeTool;
|
|
181
|
+
if (initial === "hand" || initial === "zoom") {
|
|
182
|
+
switchTool(initial);
|
|
183
|
+
}
|
|
184
|
+
function destroy() {
|
|
185
|
+
unsub();
|
|
186
|
+
if (cleanupFn) {
|
|
187
|
+
cleanupFn();
|
|
188
|
+
cleanupFn = null;
|
|
189
|
+
}
|
|
190
|
+
setCursorClass("pointer");
|
|
191
|
+
}
|
|
192
|
+
return { destroy };
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=ViewToolController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewToolController.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/tools/ViewToolController.ts"],"names":[],"mappings":"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"}
|