@yorab/react-paint 0.6.4 → 0.7.1
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/README.md +5 -5
- package/dist/components/App.js +236 -423
- package/dist/components/Canvas.js +120 -139
- package/dist/components/common/Button.js +41 -50
- package/dist/components/common/Loading.js +24 -33
- package/dist/components/common/Modal.js +18 -17
- package/dist/components/common/Panel.js +20 -28
- package/dist/components/common/Snackbar.js +31 -38
- package/dist/components/settings/ColorField.js +59 -68
- package/dist/components/settings/DeleteButton.js +10 -9
- package/dist/components/settings/FontFamilyField.js +25 -20
- package/dist/components/settings/LayoutButton.js +11 -9
- package/dist/components/settings/Layouts.js +111 -111
- package/dist/components/settings/LineArrowField.js +25 -22
- package/dist/components/settings/LineTypeField.js +23 -20
- package/dist/components/settings/PointsNumberField.js +14 -13
- package/dist/components/settings/RangeField.js +35 -47
- package/dist/components/settings/SelectField.js +34 -43
- package/dist/components/settings/SettingsBar.js +100 -121
- package/dist/components/settings/ToggleField.js +18 -25
- package/dist/components/toolbox/EditTextBox.js +62 -49
- package/dist/components/toolbox/LoadFileTool.js +19 -21
- package/dist/components/toolbox/MenuGroup.js +66 -100
- package/dist/components/toolbox/PictureUrlInput.js +33 -62
- package/dist/components/toolbox/Tool.js +13 -13
- package/dist/components/toolbox/Toolbar.js +79 -113
- package/dist/components/toolbox/ToolbarGroup.js +60 -63
- package/dist/constants/app.js +51 -0
- package/dist/constants/icons.js +42 -48
- package/dist/constants/loading.js +8 -0
- package/dist/constants/shapes.js +10 -8
- package/dist/constants/snackbar.js +7 -15
- package/dist/constants/style.js +21 -18
- package/dist/constants/tools.js +99 -103
- package/dist/hooks/useComponent.js +15 -20
- package/dist/hooks/useDoubleClick.js +12 -12
- package/dist/hooks/useDrag.js +24 -32
- package/dist/hooks/useDrawableCanvas.js +106 -122
- package/dist/hooks/useKeyboard.js +80 -63
- package/dist/hooks/useResizeObserver.js +18 -16
- package/dist/hooks/useShapes.js +92 -144
- package/dist/hooks/useSnackbar.js +28 -58
- package/dist/styles.css +16 -13
- package/dist/types/Mode.js +1 -13
- package/dist/types/Shapes.js +1 -17
- package/dist/types/snackbar.js +5 -0
- package/dist/types/tools.js +1 -18
- package/dist/utils/canvas.js +49 -0
- package/dist/utils/data.js +15 -274
- package/dist/utils/dom.js +12 -0
- package/dist/utils/file.js +75 -120
- package/dist/utils/intersect.js +54 -131
- package/dist/utils/migration.js +59 -0
- package/dist/utils/selection.js +18 -20
- package/dist/utils/shapes/brush.js +135 -0
- package/dist/utils/shapes/circle.js +93 -0
- package/dist/utils/shapes/curve.js +55 -0
- package/dist/utils/shapes/default.js +73 -0
- package/dist/utils/shapes/ellipse.js +101 -0
- package/dist/utils/shapes/grid.js +36 -0
- package/dist/utils/shapes/index.js +341 -0
- package/dist/utils/shapes/line.js +179 -0
- package/dist/utils/shapes/picture.js +88 -0
- package/dist/utils/shapes/polygon.js +69 -0
- package/dist/utils/shapes/rectangle.js +100 -0
- package/dist/utils/shapes/text.js +128 -0
- package/dist/utils/shapes/triangle.js +24 -0
- package/dist/utils/string.js +10 -16
- package/dist/utils/style.js +11 -13
- package/dist/utils/toolbar.js +35 -49
- package/dist/utils/transform.js +47 -339
- package/dist/utils/trigo.js +42 -0
- package/package.json +6 -6
- package/Changelog.md +0 -119
- package/dist/types/keyboard.js +0 -28
- package/dist/utils/draw.js +0 -461
- package/dist/utils/shapeData.js +0 -173
package/dist/hooks/useDrag.js
CHANGED
|
@@ -1,43 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
|
-
exports
|
|
9
|
-
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
6
|
+
exports.default = void 0;
|
|
11
7
|
|
|
12
8
|
var _react = require("react");
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
isOver = _useState2[0],
|
|
27
|
-
setIsOver = _useState2[1];
|
|
28
|
-
|
|
29
|
-
(0, _react.useEffect)(function () {
|
|
10
|
+
const useDrag = _ref => {
|
|
11
|
+
let {
|
|
12
|
+
disabled = false,
|
|
13
|
+
ref,
|
|
14
|
+
shape,
|
|
15
|
+
layoutDragging,
|
|
16
|
+
setLayoutDragging,
|
|
17
|
+
handleSelect,
|
|
18
|
+
onMoveShapes
|
|
19
|
+
} = _ref;
|
|
20
|
+
const [isOver, setIsOver] = (0, _react.useState)(false);
|
|
21
|
+
(0, _react.useEffect)(() => {
|
|
30
22
|
if (!layoutDragging) setIsOver(false);
|
|
31
23
|
}, [layoutDragging]);
|
|
32
|
-
(0, _react.useEffect)(
|
|
33
|
-
|
|
24
|
+
(0, _react.useEffect)(() => {
|
|
25
|
+
const layoutRef = ref.current;
|
|
34
26
|
if (!layoutRef) return;
|
|
35
27
|
|
|
36
|
-
|
|
28
|
+
const handleDragEnd = () => {
|
|
37
29
|
setLayoutDragging(undefined);
|
|
38
30
|
};
|
|
39
31
|
|
|
40
|
-
|
|
32
|
+
const handleDragOver = e => {
|
|
41
33
|
if (e.preventDefault) {
|
|
42
34
|
e.preventDefault();
|
|
43
35
|
}
|
|
@@ -45,7 +37,7 @@ var useDrag = function useDrag(_ref) {
|
|
|
45
37
|
return false;
|
|
46
38
|
};
|
|
47
39
|
|
|
48
|
-
|
|
40
|
+
const handleDragStart = e => {
|
|
49
41
|
handleSelect(shape);
|
|
50
42
|
if (!e.dataTransfer) return;
|
|
51
43
|
e.dataTransfer.effectAllowed = 'move';
|
|
@@ -53,15 +45,15 @@ var useDrag = function useDrag(_ref) {
|
|
|
53
45
|
setLayoutDragging(shape.id);
|
|
54
46
|
};
|
|
55
47
|
|
|
56
|
-
|
|
48
|
+
const handleDragEnter = () => {
|
|
57
49
|
layoutDragging !== shape.id && setIsOver(true);
|
|
58
50
|
};
|
|
59
51
|
|
|
60
|
-
|
|
52
|
+
const handleDragLeave = () => {
|
|
61
53
|
setIsOver(false);
|
|
62
54
|
};
|
|
63
55
|
|
|
64
|
-
|
|
56
|
+
const handleDrop = e => {
|
|
65
57
|
e.stopPropagation(); // stops the browser from redirecting.
|
|
66
58
|
|
|
67
59
|
if (e.dataTransfer) {
|
|
@@ -80,7 +72,7 @@ var useDrag = function useDrag(_ref) {
|
|
|
80
72
|
layoutRef.addEventListener('drop', handleDrop);
|
|
81
73
|
}
|
|
82
74
|
|
|
83
|
-
return
|
|
75
|
+
return () => {
|
|
84
76
|
if (!disabled) {
|
|
85
77
|
layoutRef.removeEventListener('dragstart', handleDragStart);
|
|
86
78
|
layoutRef.removeEventListener('dragend', handleDragEnd);
|
|
@@ -92,9 +84,9 @@ var useDrag = function useDrag(_ref) {
|
|
|
92
84
|
};
|
|
93
85
|
}, [disabled, ref, shape, setLayoutDragging, handleSelect, onMoveShapes, layoutDragging]);
|
|
94
86
|
return {
|
|
95
|
-
isOver
|
|
87
|
+
isOver
|
|
96
88
|
};
|
|
97
89
|
};
|
|
98
90
|
|
|
99
91
|
var _default = useDrag;
|
|
100
|
-
exports
|
|
92
|
+
exports.default = _default;
|
|
@@ -5,124 +5,111 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports
|
|
9
|
-
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
8
|
+
exports.default = void 0;
|
|
11
9
|
|
|
12
10
|
var _react = require("react");
|
|
13
11
|
|
|
14
|
-
var _fp = _interopRequireDefault(require("lodash/fp"));
|
|
15
|
-
|
|
16
12
|
var _selection = require("../utils/selection");
|
|
17
13
|
|
|
18
|
-
var _Shapes = require("../types/Shapes");
|
|
19
|
-
|
|
20
14
|
var _intersect = require("../utils/intersect");
|
|
21
15
|
|
|
22
|
-
var _Mode = require("../types/Mode");
|
|
23
|
-
|
|
24
16
|
var _transform = require("../utils/transform");
|
|
25
17
|
|
|
26
|
-
var
|
|
18
|
+
var _tools = require("../constants/tools");
|
|
27
19
|
|
|
28
|
-
var
|
|
20
|
+
var _useDoubleClick = _interopRequireDefault(require("./useDoubleClick"));
|
|
29
21
|
|
|
30
|
-
var
|
|
22
|
+
var _shapes = require("../constants/shapes");
|
|
31
23
|
|
|
32
|
-
var
|
|
24
|
+
var _shapes2 = require("../utils/shapes");
|
|
33
25
|
|
|
34
|
-
var
|
|
35
|
-
if (activeTool.type === _tools.ActionsEnum.move && canvasOffsetStartPosition !== undefined) {
|
|
36
|
-
var _cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height, scaleRatio);
|
|
26
|
+
var _brush = require("../utils/shapes/brush");
|
|
37
27
|
|
|
38
|
-
|
|
28
|
+
const handleMove = (e, canvasRef, activeTool, gridFormat, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, scaleRatio, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape, selectionPadding, isShiftPressed) => {
|
|
29
|
+
if (activeTool.type === 'move' && canvasOffsetStartPosition !== undefined) {
|
|
30
|
+
const cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height, scaleRatio);
|
|
31
|
+
setCanvasOffset([cursorPosition[0] - canvasOffsetStartPosition[0], cursorPosition[1] - canvasOffsetStartPosition[1]]);
|
|
39
32
|
}
|
|
40
33
|
|
|
41
34
|
if (selectedShape == undefined) return;
|
|
42
35
|
if (selectedShape.locked) return;
|
|
43
|
-
|
|
36
|
+
const cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height, scaleRatio);
|
|
44
37
|
|
|
45
|
-
if (selectionMode.mode ===
|
|
46
|
-
|
|
47
|
-
mode:
|
|
38
|
+
if (selectionMode.mode === 'default' || selectionMode.mode === 'textedition') {
|
|
39
|
+
const positionIntersection = (0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset, selectionPadding, scaleRatio, true) || {
|
|
40
|
+
mode: 'default'
|
|
48
41
|
};
|
|
49
42
|
setHoverMode(positionIntersection);
|
|
50
43
|
} else {
|
|
51
44
|
var _canvasRef$current;
|
|
52
45
|
|
|
53
|
-
|
|
46
|
+
const ctx = (_canvasRef$current = canvasRef.current) === null || _canvasRef$current === void 0 ? void 0 : _canvasRef$current.getContext('2d');
|
|
54
47
|
if (!ctx) return;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
updateSingleShape(_newShape);
|
|
59
|
-
setSelectedShape(_newShape);
|
|
48
|
+
const newShape = (0, _transform.transformShape)(ctx, selectedShape, cursorPosition, gridFormat, canvasOffset, selectionMode, selectionPadding, isShiftPressed);
|
|
49
|
+
updateSingleShape(newShape);
|
|
50
|
+
setSelectedShape(newShape);
|
|
60
51
|
}
|
|
61
52
|
};
|
|
62
53
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
(0, _react.useEffect)(
|
|
101
|
-
|
|
102
|
-
return window.requestAnimationFrame(function () {
|
|
103
|
-
return handleMove(e, selectionCanvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, scaleRatio, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape, selectionPadding);
|
|
104
|
-
});
|
|
105
|
-
};
|
|
54
|
+
const useDrawableCanvas = _ref => {
|
|
55
|
+
let {
|
|
56
|
+
disabled = false,
|
|
57
|
+
addShape,
|
|
58
|
+
canvasSize,
|
|
59
|
+
drawCanvasRef,
|
|
60
|
+
setActiveTool,
|
|
61
|
+
shapes,
|
|
62
|
+
selectionMode,
|
|
63
|
+
activeTool,
|
|
64
|
+
isInsideComponent,
|
|
65
|
+
setCanvasOffset,
|
|
66
|
+
selectedShape,
|
|
67
|
+
selectionCanvasRef,
|
|
68
|
+
canvasOffsetStartPosition,
|
|
69
|
+
setSelectedShape,
|
|
70
|
+
setCanvasOffsetStartPosition,
|
|
71
|
+
updateSingleShape,
|
|
72
|
+
gridFormat,
|
|
73
|
+
canvasOffset,
|
|
74
|
+
saveShapes,
|
|
75
|
+
setSelectionMode,
|
|
76
|
+
selectionPadding,
|
|
77
|
+
isShiftPressed
|
|
78
|
+
} = _ref;
|
|
79
|
+
const {
|
|
80
|
+
width,
|
|
81
|
+
height,
|
|
82
|
+
scaleRatio
|
|
83
|
+
} = canvasSize;
|
|
84
|
+
const [hoverMode, setHoverMode] = (0, _react.useState)({
|
|
85
|
+
mode: 'default'
|
|
86
|
+
});
|
|
87
|
+
const {
|
|
88
|
+
registerDoubleClickEvent,
|
|
89
|
+
unRegisterDoubleClickEvent
|
|
90
|
+
} = (0, _useDoubleClick.default)();
|
|
91
|
+
(0, _react.useEffect)(() => {
|
|
92
|
+
const handleMouseMove = e => window.requestAnimationFrame(() => handleMove(e, selectionCanvasRef, activeTool, gridFormat, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, scaleRatio, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape, selectionPadding, isShiftPressed));
|
|
106
93
|
|
|
107
94
|
if (isInsideComponent) {
|
|
108
95
|
document.addEventListener('mousemove', handleMouseMove);
|
|
109
96
|
document.addEventListener('touchmove', handleMouseMove);
|
|
110
97
|
}
|
|
111
98
|
|
|
112
|
-
return
|
|
99
|
+
return () => {
|
|
113
100
|
if (isInsideComponent) {
|
|
114
101
|
document.removeEventListener('mousemove', handleMouseMove);
|
|
115
102
|
document.removeEventListener('touchmove', handleMouseMove);
|
|
116
103
|
}
|
|
117
104
|
};
|
|
118
|
-
}, [isInsideComponent, selectionCanvasRef, selectedShape, selectionMode, setHoverMode, canvasOffset, canvasOffsetStartPosition, width, height, scaleRatio, updateSingleShape, activeTool, setCanvasOffset, setSelectedShape, selectionPadding]);
|
|
119
|
-
(0, _react.useEffect)(
|
|
120
|
-
|
|
121
|
-
if (selectionMode.mode ===
|
|
105
|
+
}, [isInsideComponent, selectionCanvasRef, selectedShape, selectionMode, setHoverMode, gridFormat, canvasOffset, canvasOffsetStartPosition, width, height, scaleRatio, updateSingleShape, activeTool, setCanvasOffset, setSelectedShape, selectionPadding, isShiftPressed]);
|
|
106
|
+
(0, _react.useEffect)(() => {
|
|
107
|
+
const handleMouseUp = () => {
|
|
108
|
+
if (selectionMode.mode === 'textedition') return;
|
|
122
109
|
|
|
123
|
-
if (selectionMode.mode !==
|
|
110
|
+
if (selectionMode.mode !== 'default') {
|
|
124
111
|
setSelectionMode({
|
|
125
|
-
mode:
|
|
112
|
+
mode: 'default'
|
|
126
113
|
});
|
|
127
114
|
saveShapes();
|
|
128
115
|
}
|
|
@@ -133,68 +120,65 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
|
|
|
133
120
|
document.addEventListener('touchend', handleMouseUp);
|
|
134
121
|
}
|
|
135
122
|
|
|
136
|
-
return
|
|
123
|
+
return () => {
|
|
137
124
|
if (isInsideComponent) {
|
|
138
125
|
document.removeEventListener('mouseup', handleMouseUp);
|
|
139
126
|
document.removeEventListener('touchend', handleMouseUp);
|
|
140
127
|
}
|
|
141
128
|
};
|
|
142
129
|
}, [isInsideComponent, selectionMode, saveShapes, setSelectionMode]);
|
|
143
|
-
(0, _react.useEffect)(
|
|
144
|
-
|
|
130
|
+
(0, _react.useEffect)(() => {
|
|
131
|
+
const ref = selectionCanvasRef.current;
|
|
145
132
|
if (!ref) return;
|
|
146
133
|
if (disabled) return;
|
|
147
134
|
|
|
148
|
-
|
|
135
|
+
const handleMouseDown = e => {
|
|
149
136
|
e.preventDefault();
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (activeTool.type === _tools.ActionsEnum.selection) {
|
|
153
|
-
var _selectShape = (0, _selection.selectShape)(shapes, cursorPosition, scaleRatio, canvasOffset, selectedShape, selectionPadding),
|
|
154
|
-
shape = _selectShape.shape,
|
|
155
|
-
mode = _selectShape.mode;
|
|
137
|
+
const cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
|
|
156
138
|
|
|
139
|
+
if (activeTool.type === 'selection') {
|
|
140
|
+
const {
|
|
141
|
+
shape,
|
|
142
|
+
mode
|
|
143
|
+
} = (0, _selection.selectShape)(shapes, cursorPosition, scaleRatio, canvasOffset, selectedShape, selectionPadding);
|
|
157
144
|
setSelectedShape(shape);
|
|
158
145
|
setSelectionMode(mode);
|
|
159
|
-
} else if (activeTool.type ===
|
|
146
|
+
} else if (activeTool.type === 'move') {
|
|
160
147
|
setCanvasOffsetStartPosition(cursorPosition);
|
|
161
148
|
}
|
|
162
149
|
|
|
163
|
-
if (
|
|
150
|
+
if (_shapes.ShapeTypeArray.includes(activeTool.type)) {
|
|
164
151
|
var _drawCanvasRef$curren;
|
|
165
152
|
|
|
166
|
-
|
|
153
|
+
const drawCtx = (_drawCanvasRef$curren = drawCanvasRef.current) === null || _drawCanvasRef$curren === void 0 ? void 0 : _drawCanvasRef$curren.getContext('2d');
|
|
167
154
|
if (!drawCtx) return;
|
|
168
155
|
|
|
169
|
-
if (activeTool.type ===
|
|
156
|
+
if (activeTool.type === 'brush') {
|
|
170
157
|
if (!!selectedShape) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
setSelectedShape(_newShape2);
|
|
158
|
+
const newShape = (0, _brush.addNewPointGroupToShape)(selectedShape, cursorPosition);
|
|
159
|
+
updateSingleShape(newShape);
|
|
160
|
+
setSelectedShape(newShape);
|
|
175
161
|
} else {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
setSelectedShape(_newShape3);
|
|
162
|
+
const newShape = (0, _shapes2.createShape)(drawCtx, activeTool, cursorPosition, gridFormat);
|
|
163
|
+
if (!newShape) return;
|
|
164
|
+
addShape(newShape);
|
|
165
|
+
setSelectedShape(newShape);
|
|
181
166
|
}
|
|
182
167
|
|
|
183
168
|
setSelectionMode({
|
|
184
|
-
mode:
|
|
169
|
+
mode: 'brush'
|
|
185
170
|
});
|
|
186
171
|
} else {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
setSelectedShape(_newShape4);
|
|
172
|
+
const newShape = (0, _shapes2.createShape)(drawCtx, activeTool, cursorPosition, gridFormat);
|
|
173
|
+
if (!newShape) return;
|
|
174
|
+
addShape(newShape);
|
|
175
|
+
setActiveTool(_tools.SELECTION_TOOL);
|
|
176
|
+
setSelectedShape(newShape);
|
|
193
177
|
setSelectionMode({
|
|
194
|
-
mode:
|
|
178
|
+
mode: 'resize',
|
|
195
179
|
cursorStartPosition: cursorPosition,
|
|
196
|
-
originalShape:
|
|
197
|
-
anchor: activeTool.type ===
|
|
180
|
+
originalShape: newShape,
|
|
181
|
+
anchor: activeTool.type === 'line' || activeTool.type === 'polygon' || activeTool.type === 'curve' ? 0 : [1, 1]
|
|
198
182
|
});
|
|
199
183
|
}
|
|
200
184
|
}
|
|
@@ -206,23 +190,23 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
|
|
|
206
190
|
ref.addEventListener('touchstart', handleMouseDown, {
|
|
207
191
|
passive: false
|
|
208
192
|
});
|
|
209
|
-
return
|
|
193
|
+
return () => {
|
|
210
194
|
ref.removeEventListener('mousedown', handleMouseDown);
|
|
211
195
|
ref.removeEventListener('touchstart', handleMouseDown);
|
|
212
196
|
};
|
|
213
|
-
}, [disabled, selectionCanvasRef, drawCanvasRef, selectedShape, activeTool, canvasOffset, setCanvasOffsetStartPosition, shapes, width, height, scaleRatio, updateSingleShape, addShape, setActiveTool, setSelectedShape, setSelectionMode, selectionPadding]);
|
|
214
|
-
(0, _react.useEffect)(
|
|
215
|
-
|
|
197
|
+
}, [disabled, selectionCanvasRef, drawCanvasRef, selectedShape, activeTool, canvasOffset, setCanvasOffsetStartPosition, shapes, width, height, scaleRatio, updateSingleShape, addShape, setActiveTool, setSelectedShape, setSelectionMode, selectionPadding, gridFormat]);
|
|
198
|
+
(0, _react.useEffect)(() => {
|
|
199
|
+
const ref = selectionCanvasRef.current;
|
|
216
200
|
if (!ref) return;
|
|
217
201
|
|
|
218
|
-
|
|
219
|
-
if (activeTool.type ===
|
|
220
|
-
if ((selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) ===
|
|
221
|
-
|
|
202
|
+
const handleDoubleClick = e => {
|
|
203
|
+
if (activeTool.type === 'selection') {
|
|
204
|
+
if ((selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) === 'text') {
|
|
205
|
+
const cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
|
|
222
206
|
|
|
223
207
|
if ((0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset, selectionPadding)) {
|
|
224
208
|
setSelectionMode({
|
|
225
|
-
mode:
|
|
209
|
+
mode: 'textedition',
|
|
226
210
|
defaultValue: selectedShape.value
|
|
227
211
|
});
|
|
228
212
|
}
|
|
@@ -232,15 +216,15 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
|
|
|
232
216
|
|
|
233
217
|
if (isInsideComponent) {
|
|
234
218
|
registerDoubleClickEvent(ref, handleDoubleClick);
|
|
235
|
-
return
|
|
219
|
+
return () => {
|
|
236
220
|
unRegisterDoubleClickEvent(ref);
|
|
237
221
|
};
|
|
238
222
|
}
|
|
239
223
|
}, [registerDoubleClickEvent, unRegisterDoubleClickEvent, isInsideComponent, selectionCanvasRef, activeTool, selectedShape, width, height, scaleRatio, canvasOffset, setSelectionMode, selectionPadding]);
|
|
240
224
|
return {
|
|
241
|
-
hoverMode
|
|
225
|
+
hoverMode
|
|
242
226
|
};
|
|
243
227
|
};
|
|
244
228
|
|
|
245
229
|
var _default = useDrawableCanvas;
|
|
246
|
-
exports
|
|
230
|
+
exports.default = _default;
|
|
@@ -1,67 +1,80 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
|
-
exports
|
|
9
|
-
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
6
|
+
exports.default = void 0;
|
|
11
7
|
|
|
12
|
-
var
|
|
8
|
+
var _style = require("../constants/style");
|
|
13
9
|
|
|
14
10
|
var _react = require("react");
|
|
15
11
|
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
backwardShape = _ref.backwardShape,
|
|
35
|
-
forwardShape = _ref.forwardShape;
|
|
36
|
-
|
|
37
|
-
var _useState = (0, _react.useState)(undefined),
|
|
38
|
-
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
39
|
-
copiedShape = _useState2[0],
|
|
40
|
-
setCopiedShape = _useState2[1];
|
|
12
|
+
var _shapes = require("../utils/shapes");
|
|
13
|
+
|
|
14
|
+
const KeyboardCode = {
|
|
15
|
+
ArrowUp: 'ArrowUp',
|
|
16
|
+
ArrowDown: 'ArrowDown',
|
|
17
|
+
ArrowLeft: 'ArrowLeft',
|
|
18
|
+
ArrowRight: 'ArrowRight',
|
|
19
|
+
Delete: 'Delete',
|
|
20
|
+
Backspace: 'Backspace',
|
|
21
|
+
Escape: 'Escape',
|
|
22
|
+
Shift: 'Shift',
|
|
23
|
+
Z: 'z',
|
|
24
|
+
Y: 'y'
|
|
25
|
+
};
|
|
26
|
+
const KeyboardCommand = {
|
|
27
|
+
Copy: 'copy',
|
|
28
|
+
Paste: 'paste'
|
|
29
|
+
};
|
|
41
30
|
|
|
42
|
-
|
|
43
|
-
|
|
31
|
+
const useKeyboard = _ref => {
|
|
32
|
+
let {
|
|
33
|
+
gridFormat,
|
|
34
|
+
isInsideComponent,
|
|
35
|
+
selectedShape,
|
|
36
|
+
isEditingText,
|
|
37
|
+
setSelectedShape,
|
|
38
|
+
removeShape,
|
|
39
|
+
pasteShape,
|
|
40
|
+
updateShape,
|
|
41
|
+
backwardShape,
|
|
42
|
+
forwardShape,
|
|
43
|
+
setShiftPressed
|
|
44
|
+
} = _ref;
|
|
45
|
+
const [copiedShape, setCopiedShape] = (0, _react.useState)(undefined);
|
|
46
|
+
(0, _react.useEffect)(() => {
|
|
47
|
+
const handleCopy = e => {
|
|
44
48
|
if (!selectedShape) return;
|
|
45
49
|
if (isEditingText) return;
|
|
46
50
|
e.preventDefault();
|
|
47
|
-
setCopiedShape(
|
|
51
|
+
setCopiedShape({ ...selectedShape
|
|
52
|
+
});
|
|
48
53
|
};
|
|
49
54
|
|
|
50
|
-
|
|
55
|
+
const handlePaste = e => {
|
|
51
56
|
if (!copiedShape) return;
|
|
52
57
|
if (isEditingText) return;
|
|
53
58
|
e.preventDefault();
|
|
54
|
-
pasteShape((0,
|
|
59
|
+
pasteShape((0, _shapes.copyShape)(copiedShape, gridFormat));
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const handleKeyUp = e => {
|
|
63
|
+
switch (e.key) {
|
|
64
|
+
case KeyboardCode.Shift:
|
|
65
|
+
setShiftPressed(false);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
55
68
|
};
|
|
56
69
|
|
|
57
|
-
|
|
70
|
+
const handleKeyDown = e => {
|
|
58
71
|
if (e.metaKey || e.ctrlKey) {
|
|
59
|
-
if (e.key ===
|
|
72
|
+
if (e.key === KeyboardCode.Z) {
|
|
60
73
|
e.preventDefault();
|
|
61
74
|
e.stopPropagation();
|
|
62
75
|
backwardShape();
|
|
63
76
|
return;
|
|
64
|
-
} else if (e.key ===
|
|
77
|
+
} else if (e.key === KeyboardCode.Y) {
|
|
65
78
|
e.preventDefault();
|
|
66
79
|
e.stopPropagation();
|
|
67
80
|
forwardShape();
|
|
@@ -69,34 +82,36 @@ var useKeyboard = function useKeyboard(_ref) {
|
|
|
69
82
|
}
|
|
70
83
|
}
|
|
71
84
|
|
|
85
|
+
if (e.key === KeyboardCode.Shift) {
|
|
86
|
+
setShiftPressed(true);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
72
90
|
if (!selectedShape) return;
|
|
73
91
|
|
|
74
|
-
if (e.key ===
|
|
92
|
+
if (e.key === KeyboardCode.Escape) {
|
|
75
93
|
setSelectedShape(undefined);
|
|
76
94
|
return;
|
|
77
95
|
}
|
|
78
96
|
|
|
79
97
|
if (isEditingText) return;
|
|
98
|
+
const translationMap = {
|
|
99
|
+
[KeyboardCode.ArrowLeft]: [gridFormat ? -_style.GRID_STEP[gridFormat - 1] : -1, 0],
|
|
100
|
+
[KeyboardCode.ArrowRight]: [gridFormat ? _style.GRID_STEP[gridFormat - 1] : 1, 0],
|
|
101
|
+
[KeyboardCode.ArrowDown]: [0, gridFormat ? _style.GRID_STEP[gridFormat - 1] : 1],
|
|
102
|
+
[KeyboardCode.ArrowUp]: [0, gridFormat ? -_style.GRID_STEP[gridFormat - 1] : -1]
|
|
103
|
+
};
|
|
80
104
|
|
|
81
105
|
switch (e.key) {
|
|
82
|
-
case
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
updateShape(_fp["default"].set('translation', [selectedShape.translation[0] + 1, selectedShape.translation[1]], selectedShape));
|
|
88
|
-
break;
|
|
89
|
-
|
|
90
|
-
case _keyboard.KeyboardCode.ArrowDown:
|
|
91
|
-
updateShape(_fp["default"].set('translation', [selectedShape.translation[0], selectedShape.translation[1] + 1], selectedShape));
|
|
92
|
-
break;
|
|
93
|
-
|
|
94
|
-
case _keyboard.KeyboardCode.ArrowUp:
|
|
95
|
-
updateShape(_fp["default"].set('translation', [selectedShape.translation[0], selectedShape.translation[1] - 1], selectedShape));
|
|
106
|
+
case KeyboardCode.ArrowLeft:
|
|
107
|
+
case KeyboardCode.ArrowRight:
|
|
108
|
+
case KeyboardCode.ArrowDown:
|
|
109
|
+
case KeyboardCode.ArrowUp:
|
|
110
|
+
updateShape((0, _shapes.translateShape)(translationMap[e.key], selectedShape, [0, 0], gridFormat));
|
|
96
111
|
break;
|
|
97
112
|
|
|
98
|
-
case
|
|
99
|
-
case
|
|
113
|
+
case KeyboardCode.Delete:
|
|
114
|
+
case KeyboardCode.Backspace:
|
|
100
115
|
removeShape(selectedShape);
|
|
101
116
|
break;
|
|
102
117
|
}
|
|
@@ -104,20 +119,22 @@ var useKeyboard = function useKeyboard(_ref) {
|
|
|
104
119
|
|
|
105
120
|
if (isInsideComponent) {
|
|
106
121
|
document.addEventListener('keydown', handleKeyDown);
|
|
107
|
-
document.addEventListener(
|
|
108
|
-
document.addEventListener(
|
|
122
|
+
document.addEventListener('keyup', handleKeyUp);
|
|
123
|
+
document.addEventListener(KeyboardCommand.Copy, handleCopy);
|
|
124
|
+
document.addEventListener(KeyboardCommand.Paste, handlePaste);
|
|
109
125
|
}
|
|
110
126
|
|
|
111
|
-
return
|
|
127
|
+
return () => {
|
|
112
128
|
if (isInsideComponent) {
|
|
113
129
|
document.removeEventListener('keydown', handleKeyDown);
|
|
114
|
-
document.removeEventListener(
|
|
115
|
-
document.removeEventListener(
|
|
130
|
+
document.removeEventListener('keyup', handleKeyUp);
|
|
131
|
+
document.removeEventListener(KeyboardCommand.Copy, handleCopy);
|
|
132
|
+
document.removeEventListener(KeyboardCommand.Paste, handlePaste);
|
|
116
133
|
}
|
|
117
134
|
};
|
|
118
|
-
}, [isInsideComponent, copiedShape, isEditingText, selectedShape, updateShape, removeShape, setSelectedShape, pasteShape, backwardShape, forwardShape]);
|
|
135
|
+
}, [isInsideComponent, gridFormat, copiedShape, isEditingText, selectedShape, updateShape, removeShape, setSelectedShape, pasteShape, backwardShape, forwardShape, setShiftPressed]);
|
|
119
136
|
return {};
|
|
120
137
|
};
|
|
121
138
|
|
|
122
139
|
var _default = useKeyboard;
|
|
123
|
-
exports
|
|
140
|
+
exports.default = _default;
|