@markup-canvas/core 1.1.5 → 1.1.7
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/lib/MarkupCanvas.d.ts +1 -0
- package/dist/lib/events/mouse/handleMouseMove.d.ts +2 -2
- package/dist/lib/events/utils/getViewportCenter.d.ts +5 -0
- package/dist/markup-canvas.cjs.js +63 -56
- package/dist/markup-canvas.esm.js +63 -56
- package/dist/markup-canvas.umd.js +61 -54
- package/dist/markup-canvas.umd.min.js +1 -1
- package/dist/types/canvas.d.ts +1 -0
- package/package.json +1 -1
- package/src/lib/MarkupCanvas.ts +30 -16
- package/src/lib/config/presets/editor-preset.ts +2 -2
- package/src/lib/events/keyboard/setupKeyboardEvents.ts +15 -36
- package/src/lib/events/mouse/handleMouseMove.ts +7 -2
- package/src/lib/events/mouse/setupMouseDrag.ts +19 -6
- package/src/lib/events/mouse/setupMouseEvents.ts +19 -6
- package/src/lib/events/utils/getViewportCenter.ts +14 -0
- package/src/types/canvas.ts +1 -0
- package/dist/lib/events/keyboard/setupKeyboardNavigation.d.ts +0 -2
- package/src/lib/events/keyboard/setupKeyboardNavigation.ts +0 -115
|
@@ -42,6 +42,7 @@ export declare class MarkupCanvas implements Canvas {
|
|
|
42
42
|
};
|
|
43
43
|
zoomToPoint(x: number, y: number, targetScale: number): boolean;
|
|
44
44
|
resetView(): boolean;
|
|
45
|
+
resetViewToCenter(): boolean;
|
|
45
46
|
zoomToFitContent(): boolean;
|
|
46
47
|
panLeft(distance?: number): boolean;
|
|
47
48
|
panRight(distance?: number): boolean;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Canvas } from "@/types/index.js";
|
|
2
|
-
export declare function handleMouseMove(event: MouseEvent, canvas: Canvas, isDragEnabled: boolean, isDragging: boolean, mouseDownTime: number, mouseDownX: number, mouseDownY: number, lastMouseX: number, lastMouseY: number, setters: {
|
|
1
|
+
import type { Canvas, MarkupCanvasConfig } from "@/types/index.js";
|
|
2
|
+
export declare function handleMouseMove(event: MouseEvent, canvas: Canvas, config: Required<MarkupCanvasConfig>, isDragEnabled: boolean, isDragging: boolean, isSpacePressed: boolean, mouseDownTime: number, mouseDownX: number, mouseDownY: number, lastMouseX: number, lastMouseY: number, setters: {
|
|
3
3
|
setHasDragged: (value: boolean) => void;
|
|
4
4
|
setIsDragging: (value: boolean) => void;
|
|
5
5
|
setLastMouseX: (value: number) => void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Markup Canvas
|
|
3
3
|
* High-performance markup canvas with zoom and pan capabilities
|
|
4
|
-
* @version 1.1.
|
|
4
|
+
* @version 1.1.7
|
|
5
5
|
*/
|
|
6
6
|
'use strict';
|
|
7
7
|
|
|
@@ -20,8 +20,8 @@ const EDITOR_PRESET = {
|
|
|
20
20
|
enableZoom: true,
|
|
21
21
|
enablePan: true,
|
|
22
22
|
enableTouch: true,
|
|
23
|
-
enableKeyboard:
|
|
24
|
-
bindKeyboardEventsTo: "
|
|
23
|
+
enableKeyboard: true,
|
|
24
|
+
bindKeyboardEventsTo: "document",
|
|
25
25
|
// Zoom behavior
|
|
26
26
|
zoomSpeed: 1.5,
|
|
27
27
|
minZoom: 0.05,
|
|
@@ -276,13 +276,6 @@ function withRulerSize(canvas, rulerSize, operation) {
|
|
|
276
276
|
const finalRulerSize = hasRulers ? rulerSize : 0;
|
|
277
277
|
return operation(finalRulerSize);
|
|
278
278
|
}
|
|
279
|
-
function withRulerOffsets(canvas, rulerSize, x, y, operation) {
|
|
280
|
-
return withRulerSize(canvas, rulerSize, (rulerSize) => {
|
|
281
|
-
const adjustedX = x - rulerSize;
|
|
282
|
-
const adjustedY = y - rulerSize;
|
|
283
|
-
return operation(adjustedX, adjustedY);
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
279
|
function withRulerOffsetObject(canvas, rulerSize, coords, operation) {
|
|
287
280
|
return withRulerSize(canvas, rulerSize, (rulerSize) => {
|
|
288
281
|
const adjusted = {
|
|
@@ -776,42 +769,28 @@ function getAdaptiveZoomSpeed(canvas, baseSpeed) {
|
|
|
776
769
|
}
|
|
777
770
|
|
|
778
771
|
function setupKeyboardEvents(canvas, config) {
|
|
779
|
-
// Track mouse position
|
|
780
|
-
let lastMouseX = 0;
|
|
781
|
-
let lastMouseY = 0;
|
|
782
|
-
function handleMouseMove(event) {
|
|
783
|
-
const rect = canvas.container.getBoundingClientRect();
|
|
784
|
-
const rawMouseX = event.clientX - rect.left;
|
|
785
|
-
const rawMouseY = event.clientY - rect.top;
|
|
786
|
-
withRulerOffsets(canvas, config.rulerSize, rawMouseX, rawMouseY, (adjustedX, adjustedY) => {
|
|
787
|
-
lastMouseX = adjustedX;
|
|
788
|
-
lastMouseY = adjustedY;
|
|
789
|
-
});
|
|
790
|
-
}
|
|
791
772
|
function handleKeyDown(event) {
|
|
792
773
|
if (!(event instanceof KeyboardEvent))
|
|
793
774
|
return;
|
|
794
775
|
if (config.bindKeyboardEventsTo === "canvas" && document.activeElement !== canvas.container)
|
|
795
776
|
return;
|
|
796
|
-
const isFastPan = event.shiftKey;
|
|
797
|
-
const panDistance = config.keyboardPanStep * (isFastPan ? config.keyboardFastMultiplier : 1);
|
|
798
777
|
let handled = false;
|
|
799
778
|
const newTransform = {};
|
|
800
779
|
switch (event.key) {
|
|
801
780
|
case "ArrowLeft":
|
|
802
|
-
newTransform.translateX = canvas.transform.translateX +
|
|
781
|
+
newTransform.translateX = canvas.transform.translateX + config.keyboardPanStep;
|
|
803
782
|
handled = true;
|
|
804
783
|
break;
|
|
805
784
|
case "ArrowRight":
|
|
806
|
-
newTransform.translateX = canvas.transform.translateX -
|
|
785
|
+
newTransform.translateX = canvas.transform.translateX - config.keyboardPanStep;
|
|
807
786
|
handled = true;
|
|
808
787
|
break;
|
|
809
788
|
case "ArrowUp":
|
|
810
|
-
newTransform.translateY = canvas.transform.translateY +
|
|
789
|
+
newTransform.translateY = canvas.transform.translateY + config.keyboardPanStep;
|
|
811
790
|
handled = true;
|
|
812
791
|
break;
|
|
813
792
|
case "ArrowDown":
|
|
814
|
-
newTransform.translateY = canvas.transform.translateY -
|
|
793
|
+
newTransform.translateY = canvas.transform.translateY - config.keyboardPanStep;
|
|
815
794
|
handled = true;
|
|
816
795
|
break;
|
|
817
796
|
case "=":
|
|
@@ -820,7 +799,7 @@ function setupKeyboardEvents(canvas, config) {
|
|
|
820
799
|
const adaptiveZoomStep = config.enableAdaptiveSpeed
|
|
821
800
|
? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
|
|
822
801
|
: config.keyboardZoomStep;
|
|
823
|
-
|
|
802
|
+
canvas.zoomIn(adaptiveZoomStep);
|
|
824
803
|
handled = true;
|
|
825
804
|
}
|
|
826
805
|
break;
|
|
@@ -829,16 +808,21 @@ function setupKeyboardEvents(canvas, config) {
|
|
|
829
808
|
const adaptiveZoomStep = config.enableAdaptiveSpeed
|
|
830
809
|
? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
|
|
831
810
|
: config.keyboardZoomStep;
|
|
832
|
-
|
|
811
|
+
canvas.zoomOut(adaptiveZoomStep);
|
|
833
812
|
handled = true;
|
|
834
813
|
}
|
|
835
814
|
break;
|
|
836
815
|
case "0":
|
|
837
|
-
if (event.
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
816
|
+
if (event.ctrlKey) {
|
|
817
|
+
if (canvas.resetView) {
|
|
818
|
+
canvas.resetView();
|
|
819
|
+
}
|
|
820
|
+
handled = true;
|
|
821
|
+
}
|
|
822
|
+
else if (event.metaKey || event.ctrlKey) {
|
|
823
|
+
if (canvas.resetViewToCenter) {
|
|
824
|
+
canvas.resetViewToCenter();
|
|
825
|
+
}
|
|
842
826
|
handled = true;
|
|
843
827
|
}
|
|
844
828
|
break;
|
|
@@ -866,10 +850,8 @@ function setupKeyboardEvents(canvas, config) {
|
|
|
866
850
|
}
|
|
867
851
|
const keyboardTarget = config.bindKeyboardEventsTo === "canvas" ? canvas.container : document;
|
|
868
852
|
keyboardTarget.addEventListener("keydown", handleKeyDown);
|
|
869
|
-
canvas.container.addEventListener("mousemove", handleMouseMove);
|
|
870
853
|
return () => {
|
|
871
854
|
keyboardTarget.removeEventListener("keydown", handleKeyDown);
|
|
872
|
-
canvas.container.removeEventListener("mousemove", handleMouseMove);
|
|
873
855
|
};
|
|
874
856
|
}
|
|
875
857
|
|
|
@@ -942,13 +924,15 @@ function handleMouseLeave(canvas, config, isDragEnabled, isSpacePressed, isDragg
|
|
|
942
924
|
}
|
|
943
925
|
}
|
|
944
926
|
|
|
945
|
-
function handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
|
|
927
|
+
function handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
|
|
946
928
|
if (mouseDownTime > 0) {
|
|
947
929
|
const deltaX = Math.abs(event.clientX - mouseDownX);
|
|
948
930
|
const deltaY = Math.abs(event.clientY - mouseDownY);
|
|
949
931
|
if (deltaX > CLICK_THRESHOLDS.MAX_MOVEMENT || deltaY > CLICK_THRESHOLDS.MAX_MOVEMENT) {
|
|
950
932
|
setters.setHasDragged(true);
|
|
951
|
-
if
|
|
933
|
+
// Check if drag is allowed based on configuration
|
|
934
|
+
const canDrag = config.requireSpaceForMouseDrag ? isSpacePressed : true;
|
|
935
|
+
if (!isDragging && isDragEnabled && canDrag) {
|
|
952
936
|
setters.setIsDragging(true);
|
|
953
937
|
}
|
|
954
938
|
}
|
|
@@ -1089,7 +1073,7 @@ function setupMouseEvents(canvas, config, withControls = true) {
|
|
|
1089
1073
|
handleMouseDown(event, canvas, config, isDragEnabled, isSpacePressed, setters);
|
|
1090
1074
|
};
|
|
1091
1075
|
const mouseMoveHandler = (event) => {
|
|
1092
|
-
handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
|
|
1076
|
+
handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
|
|
1093
1077
|
setHasDragged: setters.setHasDragged,
|
|
1094
1078
|
setIsDragging: setters.setIsDragging,
|
|
1095
1079
|
setLastMouseX: setters.setLastMouseX,
|
|
@@ -1488,6 +1472,20 @@ function setupWheelEvents(canvas, config) {
|
|
|
1488
1472
|
};
|
|
1489
1473
|
}
|
|
1490
1474
|
|
|
1475
|
+
function getViewportCenter(canvas) {
|
|
1476
|
+
try {
|
|
1477
|
+
const bounds = canvas.getBounds();
|
|
1478
|
+
return {
|
|
1479
|
+
x: bounds.width / 2,
|
|
1480
|
+
y: bounds.height / 2,
|
|
1481
|
+
};
|
|
1482
|
+
}
|
|
1483
|
+
catch (error) {
|
|
1484
|
+
console.warn("Failed to calculate viewport center:", error);
|
|
1485
|
+
return { x: 0, y: 0 };
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1491
1489
|
// Rulers
|
|
1492
1490
|
const RULER_Z_INDEX = {
|
|
1493
1491
|
GRID: 100,
|
|
@@ -2086,12 +2084,23 @@ class MarkupCanvas {
|
|
|
2086
2084
|
});
|
|
2087
2085
|
}
|
|
2088
2086
|
resetView() {
|
|
2087
|
+
const result = this.baseCanvas.resetView ? this.baseCanvas.resetView() : false;
|
|
2088
|
+
if (result) {
|
|
2089
|
+
this.emitTransformEvents();
|
|
2090
|
+
}
|
|
2091
|
+
return result;
|
|
2092
|
+
}
|
|
2093
|
+
resetViewToCenter() {
|
|
2089
2094
|
return withTransition(this.transformLayer, this.config, () => {
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
this
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
+
return withClampedZoom(this.config, (clamp) => {
|
|
2096
|
+
const newScale = clamp(1.0);
|
|
2097
|
+
const center = getViewportCenter(this);
|
|
2098
|
+
const result = this.zoomToPoint(center.x, center.y, newScale);
|
|
2099
|
+
if (result) {
|
|
2100
|
+
this.emitTransformEvents();
|
|
2101
|
+
}
|
|
2102
|
+
return result;
|
|
2103
|
+
});
|
|
2095
2104
|
});
|
|
2096
2105
|
}
|
|
2097
2106
|
zoomToFitContent() {
|
|
@@ -2133,30 +2142,28 @@ class MarkupCanvas {
|
|
|
2133
2142
|
return this.updateTransform(newTransform);
|
|
2134
2143
|
}
|
|
2135
2144
|
// Zoom methods
|
|
2136
|
-
zoomIn(factor = 0.
|
|
2145
|
+
zoomIn(factor = 0.5) {
|
|
2137
2146
|
return withTransition(this.transformLayer, this.config, () => {
|
|
2138
2147
|
return withClampedZoom(this.config, (clamp) => {
|
|
2139
2148
|
const newScale = clamp(this.baseCanvas.transform.scale * (1 + factor));
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
return this.updateTransform(newTransform);
|
|
2149
|
+
// Get the center of the viewport
|
|
2150
|
+
const center = getViewportCenter(this);
|
|
2151
|
+
return this.zoomToPoint(center.x, center.y, newScale);
|
|
2144
2152
|
});
|
|
2145
2153
|
});
|
|
2146
2154
|
}
|
|
2147
|
-
zoomOut(factor = 0.
|
|
2155
|
+
zoomOut(factor = 0.5) {
|
|
2148
2156
|
return withTransition(this.transformLayer, this.config, () => {
|
|
2149
2157
|
return withClampedZoom(this.config, (clamp) => {
|
|
2150
2158
|
const newScale = clamp(this.baseCanvas.transform.scale * (1 - factor));
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
return this.updateTransform(newTransform);
|
|
2159
|
+
// Get the center of the viewport
|
|
2160
|
+
const center = getViewportCenter(this);
|
|
2161
|
+
return this.zoomToPoint(center.x, center.y, newScale);
|
|
2155
2162
|
});
|
|
2156
2163
|
});
|
|
2157
2164
|
}
|
|
2158
2165
|
resetZoom() {
|
|
2159
|
-
return this.
|
|
2166
|
+
return this.resetViewToCenter();
|
|
2160
2167
|
}
|
|
2161
2168
|
// Mouse drag control methods
|
|
2162
2169
|
enableMouseDrag() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Markup Canvas
|
|
3
3
|
* High-performance markup canvas with zoom and pan capabilities
|
|
4
|
-
* @version 1.1.
|
|
4
|
+
* @version 1.1.7
|
|
5
5
|
*/
|
|
6
6
|
const EDITOR_PRESET = {
|
|
7
7
|
// Canvas dimensions
|
|
@@ -16,8 +16,8 @@ const EDITOR_PRESET = {
|
|
|
16
16
|
enableZoom: true,
|
|
17
17
|
enablePan: true,
|
|
18
18
|
enableTouch: true,
|
|
19
|
-
enableKeyboard:
|
|
20
|
-
bindKeyboardEventsTo: "
|
|
19
|
+
enableKeyboard: true,
|
|
20
|
+
bindKeyboardEventsTo: "document",
|
|
21
21
|
// Zoom behavior
|
|
22
22
|
zoomSpeed: 1.5,
|
|
23
23
|
minZoom: 0.05,
|
|
@@ -272,13 +272,6 @@ function withRulerSize(canvas, rulerSize, operation) {
|
|
|
272
272
|
const finalRulerSize = hasRulers ? rulerSize : 0;
|
|
273
273
|
return operation(finalRulerSize);
|
|
274
274
|
}
|
|
275
|
-
function withRulerOffsets(canvas, rulerSize, x, y, operation) {
|
|
276
|
-
return withRulerSize(canvas, rulerSize, (rulerSize) => {
|
|
277
|
-
const adjustedX = x - rulerSize;
|
|
278
|
-
const adjustedY = y - rulerSize;
|
|
279
|
-
return operation(adjustedX, adjustedY);
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
275
|
function withRulerOffsetObject(canvas, rulerSize, coords, operation) {
|
|
283
276
|
return withRulerSize(canvas, rulerSize, (rulerSize) => {
|
|
284
277
|
const adjusted = {
|
|
@@ -772,42 +765,28 @@ function getAdaptiveZoomSpeed(canvas, baseSpeed) {
|
|
|
772
765
|
}
|
|
773
766
|
|
|
774
767
|
function setupKeyboardEvents(canvas, config) {
|
|
775
|
-
// Track mouse position
|
|
776
|
-
let lastMouseX = 0;
|
|
777
|
-
let lastMouseY = 0;
|
|
778
|
-
function handleMouseMove(event) {
|
|
779
|
-
const rect = canvas.container.getBoundingClientRect();
|
|
780
|
-
const rawMouseX = event.clientX - rect.left;
|
|
781
|
-
const rawMouseY = event.clientY - rect.top;
|
|
782
|
-
withRulerOffsets(canvas, config.rulerSize, rawMouseX, rawMouseY, (adjustedX, adjustedY) => {
|
|
783
|
-
lastMouseX = adjustedX;
|
|
784
|
-
lastMouseY = adjustedY;
|
|
785
|
-
});
|
|
786
|
-
}
|
|
787
768
|
function handleKeyDown(event) {
|
|
788
769
|
if (!(event instanceof KeyboardEvent))
|
|
789
770
|
return;
|
|
790
771
|
if (config.bindKeyboardEventsTo === "canvas" && document.activeElement !== canvas.container)
|
|
791
772
|
return;
|
|
792
|
-
const isFastPan = event.shiftKey;
|
|
793
|
-
const panDistance = config.keyboardPanStep * (isFastPan ? config.keyboardFastMultiplier : 1);
|
|
794
773
|
let handled = false;
|
|
795
774
|
const newTransform = {};
|
|
796
775
|
switch (event.key) {
|
|
797
776
|
case "ArrowLeft":
|
|
798
|
-
newTransform.translateX = canvas.transform.translateX +
|
|
777
|
+
newTransform.translateX = canvas.transform.translateX + config.keyboardPanStep;
|
|
799
778
|
handled = true;
|
|
800
779
|
break;
|
|
801
780
|
case "ArrowRight":
|
|
802
|
-
newTransform.translateX = canvas.transform.translateX -
|
|
781
|
+
newTransform.translateX = canvas.transform.translateX - config.keyboardPanStep;
|
|
803
782
|
handled = true;
|
|
804
783
|
break;
|
|
805
784
|
case "ArrowUp":
|
|
806
|
-
newTransform.translateY = canvas.transform.translateY +
|
|
785
|
+
newTransform.translateY = canvas.transform.translateY + config.keyboardPanStep;
|
|
807
786
|
handled = true;
|
|
808
787
|
break;
|
|
809
788
|
case "ArrowDown":
|
|
810
|
-
newTransform.translateY = canvas.transform.translateY -
|
|
789
|
+
newTransform.translateY = canvas.transform.translateY - config.keyboardPanStep;
|
|
811
790
|
handled = true;
|
|
812
791
|
break;
|
|
813
792
|
case "=":
|
|
@@ -816,7 +795,7 @@ function setupKeyboardEvents(canvas, config) {
|
|
|
816
795
|
const adaptiveZoomStep = config.enableAdaptiveSpeed
|
|
817
796
|
? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
|
|
818
797
|
: config.keyboardZoomStep;
|
|
819
|
-
|
|
798
|
+
canvas.zoomIn(adaptiveZoomStep);
|
|
820
799
|
handled = true;
|
|
821
800
|
}
|
|
822
801
|
break;
|
|
@@ -825,16 +804,21 @@ function setupKeyboardEvents(canvas, config) {
|
|
|
825
804
|
const adaptiveZoomStep = config.enableAdaptiveSpeed
|
|
826
805
|
? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
|
|
827
806
|
: config.keyboardZoomStep;
|
|
828
|
-
|
|
807
|
+
canvas.zoomOut(adaptiveZoomStep);
|
|
829
808
|
handled = true;
|
|
830
809
|
}
|
|
831
810
|
break;
|
|
832
811
|
case "0":
|
|
833
|
-
if (event.
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
812
|
+
if (event.ctrlKey) {
|
|
813
|
+
if (canvas.resetView) {
|
|
814
|
+
canvas.resetView();
|
|
815
|
+
}
|
|
816
|
+
handled = true;
|
|
817
|
+
}
|
|
818
|
+
else if (event.metaKey || event.ctrlKey) {
|
|
819
|
+
if (canvas.resetViewToCenter) {
|
|
820
|
+
canvas.resetViewToCenter();
|
|
821
|
+
}
|
|
838
822
|
handled = true;
|
|
839
823
|
}
|
|
840
824
|
break;
|
|
@@ -862,10 +846,8 @@ function setupKeyboardEvents(canvas, config) {
|
|
|
862
846
|
}
|
|
863
847
|
const keyboardTarget = config.bindKeyboardEventsTo === "canvas" ? canvas.container : document;
|
|
864
848
|
keyboardTarget.addEventListener("keydown", handleKeyDown);
|
|
865
|
-
canvas.container.addEventListener("mousemove", handleMouseMove);
|
|
866
849
|
return () => {
|
|
867
850
|
keyboardTarget.removeEventListener("keydown", handleKeyDown);
|
|
868
|
-
canvas.container.removeEventListener("mousemove", handleMouseMove);
|
|
869
851
|
};
|
|
870
852
|
}
|
|
871
853
|
|
|
@@ -938,13 +920,15 @@ function handleMouseLeave(canvas, config, isDragEnabled, isSpacePressed, isDragg
|
|
|
938
920
|
}
|
|
939
921
|
}
|
|
940
922
|
|
|
941
|
-
function handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
|
|
923
|
+
function handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
|
|
942
924
|
if (mouseDownTime > 0) {
|
|
943
925
|
const deltaX = Math.abs(event.clientX - mouseDownX);
|
|
944
926
|
const deltaY = Math.abs(event.clientY - mouseDownY);
|
|
945
927
|
if (deltaX > CLICK_THRESHOLDS.MAX_MOVEMENT || deltaY > CLICK_THRESHOLDS.MAX_MOVEMENT) {
|
|
946
928
|
setters.setHasDragged(true);
|
|
947
|
-
if
|
|
929
|
+
// Check if drag is allowed based on configuration
|
|
930
|
+
const canDrag = config.requireSpaceForMouseDrag ? isSpacePressed : true;
|
|
931
|
+
if (!isDragging && isDragEnabled && canDrag) {
|
|
948
932
|
setters.setIsDragging(true);
|
|
949
933
|
}
|
|
950
934
|
}
|
|
@@ -1085,7 +1069,7 @@ function setupMouseEvents(canvas, config, withControls = true) {
|
|
|
1085
1069
|
handleMouseDown(event, canvas, config, isDragEnabled, isSpacePressed, setters);
|
|
1086
1070
|
};
|
|
1087
1071
|
const mouseMoveHandler = (event) => {
|
|
1088
|
-
handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
|
|
1072
|
+
handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
|
|
1089
1073
|
setHasDragged: setters.setHasDragged,
|
|
1090
1074
|
setIsDragging: setters.setIsDragging,
|
|
1091
1075
|
setLastMouseX: setters.setLastMouseX,
|
|
@@ -1484,6 +1468,20 @@ function setupWheelEvents(canvas, config) {
|
|
|
1484
1468
|
};
|
|
1485
1469
|
}
|
|
1486
1470
|
|
|
1471
|
+
function getViewportCenter(canvas) {
|
|
1472
|
+
try {
|
|
1473
|
+
const bounds = canvas.getBounds();
|
|
1474
|
+
return {
|
|
1475
|
+
x: bounds.width / 2,
|
|
1476
|
+
y: bounds.height / 2,
|
|
1477
|
+
};
|
|
1478
|
+
}
|
|
1479
|
+
catch (error) {
|
|
1480
|
+
console.warn("Failed to calculate viewport center:", error);
|
|
1481
|
+
return { x: 0, y: 0 };
|
|
1482
|
+
}
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1487
1485
|
// Rulers
|
|
1488
1486
|
const RULER_Z_INDEX = {
|
|
1489
1487
|
GRID: 100,
|
|
@@ -2082,12 +2080,23 @@ class MarkupCanvas {
|
|
|
2082
2080
|
});
|
|
2083
2081
|
}
|
|
2084
2082
|
resetView() {
|
|
2083
|
+
const result = this.baseCanvas.resetView ? this.baseCanvas.resetView() : false;
|
|
2084
|
+
if (result) {
|
|
2085
|
+
this.emitTransformEvents();
|
|
2086
|
+
}
|
|
2087
|
+
return result;
|
|
2088
|
+
}
|
|
2089
|
+
resetViewToCenter() {
|
|
2085
2090
|
return withTransition(this.transformLayer, this.config, () => {
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
this
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
+
return withClampedZoom(this.config, (clamp) => {
|
|
2092
|
+
const newScale = clamp(1.0);
|
|
2093
|
+
const center = getViewportCenter(this);
|
|
2094
|
+
const result = this.zoomToPoint(center.x, center.y, newScale);
|
|
2095
|
+
if (result) {
|
|
2096
|
+
this.emitTransformEvents();
|
|
2097
|
+
}
|
|
2098
|
+
return result;
|
|
2099
|
+
});
|
|
2091
2100
|
});
|
|
2092
2101
|
}
|
|
2093
2102
|
zoomToFitContent() {
|
|
@@ -2129,30 +2138,28 @@ class MarkupCanvas {
|
|
|
2129
2138
|
return this.updateTransform(newTransform);
|
|
2130
2139
|
}
|
|
2131
2140
|
// Zoom methods
|
|
2132
|
-
zoomIn(factor = 0.
|
|
2141
|
+
zoomIn(factor = 0.5) {
|
|
2133
2142
|
return withTransition(this.transformLayer, this.config, () => {
|
|
2134
2143
|
return withClampedZoom(this.config, (clamp) => {
|
|
2135
2144
|
const newScale = clamp(this.baseCanvas.transform.scale * (1 + factor));
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
return this.updateTransform(newTransform);
|
|
2145
|
+
// Get the center of the viewport
|
|
2146
|
+
const center = getViewportCenter(this);
|
|
2147
|
+
return this.zoomToPoint(center.x, center.y, newScale);
|
|
2140
2148
|
});
|
|
2141
2149
|
});
|
|
2142
2150
|
}
|
|
2143
|
-
zoomOut(factor = 0.
|
|
2151
|
+
zoomOut(factor = 0.5) {
|
|
2144
2152
|
return withTransition(this.transformLayer, this.config, () => {
|
|
2145
2153
|
return withClampedZoom(this.config, (clamp) => {
|
|
2146
2154
|
const newScale = clamp(this.baseCanvas.transform.scale * (1 - factor));
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
return this.updateTransform(newTransform);
|
|
2155
|
+
// Get the center of the viewport
|
|
2156
|
+
const center = getViewportCenter(this);
|
|
2157
|
+
return this.zoomToPoint(center.x, center.y, newScale);
|
|
2151
2158
|
});
|
|
2152
2159
|
});
|
|
2153
2160
|
}
|
|
2154
2161
|
resetZoom() {
|
|
2155
|
-
return this.
|
|
2162
|
+
return this.resetViewToCenter();
|
|
2156
2163
|
}
|
|
2157
2164
|
// Mouse drag control methods
|
|
2158
2165
|
enableMouseDrag() {
|