react-design-editor 0.0.31 → 0.0.35

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 (101) hide show
  1. package/README.md +1 -1
  2. package/dist/react-design-editor.js +37380 -16467
  3. package/dist/react-design-editor.min.js +1 -1
  4. package/dist/react-design-editor.min.js.LICENSE.txt +13 -2
  5. package/lib/Canvas.d.ts +18 -29
  6. package/lib/Canvas.js +172 -208
  7. package/lib/CanvasObject.d.ts +10 -10
  8. package/lib/CanvasObject.js +96 -89
  9. package/lib/constants/code.d.ts +19 -0
  10. package/lib/constants/code.js +22 -0
  11. package/lib/constants/defaults.d.ts +38 -0
  12. package/lib/constants/defaults.js +69 -0
  13. package/lib/constants/index.d.ts +3 -0
  14. package/lib/constants/index.js +26 -0
  15. package/lib/handlers/AlignmentHandler.d.ts +18 -18
  16. package/lib/handlers/AlignmentHandler.js +58 -58
  17. package/lib/handlers/AnimationHandler.d.ts +50 -48
  18. package/lib/handlers/AnimationHandler.js +323 -298
  19. package/lib/handlers/ChartHandler.d.ts +8 -8
  20. package/lib/handlers/ChartHandler.js +8 -8
  21. package/lib/handlers/ContextmenuHandler.d.ts +28 -23
  22. package/lib/handlers/ContextmenuHandler.js +65 -56
  23. package/lib/handlers/CropHandler.d.ts +43 -37
  24. package/lib/handlers/CropHandler.js +261 -243
  25. package/lib/handlers/CustomHandler.d.ts +7 -0
  26. package/lib/handlers/CustomHandler.js +10 -0
  27. package/lib/handlers/DrawingHandler.d.ts +28 -28
  28. package/lib/handlers/DrawingHandler.js +318 -318
  29. package/lib/handlers/ElementHandler.d.ts +80 -80
  30. package/lib/handlers/ElementHandler.js +154 -154
  31. package/lib/handlers/EventHandler.d.ts +170 -182
  32. package/lib/handlers/EventHandler.js +880 -914
  33. package/lib/handlers/FiberHandler.d.ts +6 -0
  34. package/lib/handlers/FiberHandler.js +23 -0
  35. package/lib/handlers/GridHandler.d.ts +19 -18
  36. package/lib/handlers/GridHandler.js +77 -75
  37. package/lib/handlers/GuidelineHandler.d.ts +61 -39
  38. package/lib/handlers/GuidelineHandler.js +315 -263
  39. package/lib/handlers/Handler.d.ts +622 -543
  40. package/lib/handlers/Handler.js +1638 -1514
  41. package/lib/handlers/ImageHandler.d.ts +307 -307
  42. package/lib/handlers/ImageHandler.js +529 -484
  43. package/lib/handlers/InteractionHandler.d.ts +45 -45
  44. package/lib/handlers/InteractionHandler.js +164 -156
  45. package/lib/handlers/LinkHandler.d.ts +115 -116
  46. package/lib/handlers/LinkHandler.js +247 -246
  47. package/lib/handlers/NodeHandler.d.ts +50 -50
  48. package/lib/handlers/NodeHandler.js +274 -274
  49. package/lib/handlers/PortHandler.d.ts +22 -22
  50. package/lib/handlers/PortHandler.js +179 -179
  51. package/lib/handlers/ShortcutHandler.d.ts +119 -119
  52. package/lib/handlers/ShortcutHandler.js +151 -150
  53. package/lib/handlers/TooltipHandler.d.ts +33 -24
  54. package/lib/handlers/TooltipHandler.js +91 -78
  55. package/lib/handlers/TransactionHandler.d.ts +59 -54
  56. package/lib/handlers/TransactionHandler.js +137 -129
  57. package/lib/handlers/WorkareaHandler.d.ts +43 -31
  58. package/lib/handlers/WorkareaHandler.js +354 -355
  59. package/lib/handlers/ZoomHandler.d.ts +48 -48
  60. package/lib/handlers/ZoomHandler.js +143 -145
  61. package/lib/handlers/index.d.ts +23 -21
  62. package/lib/handlers/index.js +48 -44
  63. package/lib/index.d.ts +5 -5
  64. package/lib/index.js +19 -19
  65. package/lib/objects/Arrow.d.ts +2 -2
  66. package/lib/objects/Arrow.js +40 -39
  67. package/lib/objects/Chart.d.ts +10 -10
  68. package/lib/objects/Chart.js +117 -116
  69. package/lib/objects/CirclePort.d.ts +2 -2
  70. package/lib/objects/CirclePort.js +28 -28
  71. package/lib/objects/Cube.d.ts +5 -5
  72. package/lib/objects/Cube.js +71 -71
  73. package/lib/objects/CurvedLink.d.ts +2 -2
  74. package/lib/objects/CurvedLink.js +51 -49
  75. package/lib/objects/Element.d.ts +13 -13
  76. package/lib/objects/Element.js +77 -76
  77. package/lib/objects/Gif.d.ts +3 -3
  78. package/lib/objects/Gif.js +41 -38
  79. package/lib/objects/Iframe.d.ts +9 -9
  80. package/lib/objects/Iframe.js +63 -62
  81. package/lib/objects/Line.d.ts +2 -2
  82. package/lib/objects/Line.js +24 -24
  83. package/lib/objects/Link.d.ts +15 -15
  84. package/lib/objects/Link.js +106 -104
  85. package/lib/objects/Node.d.ts +59 -59
  86. package/lib/objects/Node.js +271 -268
  87. package/lib/objects/OrthogonalLink.d.ts +2 -2
  88. package/lib/objects/OrthogonalLink.js +54 -52
  89. package/lib/objects/Port.d.ts +12 -12
  90. package/lib/objects/Port.js +28 -28
  91. package/lib/objects/Svg.d.ts +8 -0
  92. package/lib/objects/Svg.js +59 -0
  93. package/lib/objects/Video.d.ts +14 -14
  94. package/lib/objects/Video.js +113 -112
  95. package/lib/objects/index.d.ts +15 -14
  96. package/lib/objects/index.js +32 -30
  97. package/lib/utils/ObjectUtil.d.ts +407 -412
  98. package/lib/utils/ObjectUtil.js +13 -13
  99. package/lib/utils/index.d.ts +1 -1
  100. package/lib/utils/index.js +13 -13
  101. package/package.json +7 -6
@@ -1,263 +1,315 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const fabric_1 = require("fabric");
4
- class GuidelineHandler {
5
- constructor(handler) {
6
- this.aligningLineOffset = 5;
7
- this.aligningLineMargin = 4;
8
- this.aligningLineWidth = 1;
9
- this.aligningLineColor = 'rgb(255, 0, 0)';
10
- this.zoom = 1;
11
- this.init = () => {
12
- this.ctx = this.handler.canvas.getSelectionContext();
13
- this.aligningLineOffset = 5;
14
- this.aligningLineMargin = 4;
15
- this.aligningLineWidth = 1;
16
- this.aligningLineColor = 'rgb(255, 0, 0)';
17
- this.viewportTransform = this.handler.canvas.viewportTransform;
18
- this.zoom = 1;
19
- this.verticalLines = [];
20
- this.horizontalLines = [];
21
- };
22
- this.drawVerticalLine = (coords) => {
23
- this.drawLine(coords.x + 0.5, coords.y1 > coords.y2 ? coords.y2 : coords.y1, coords.x + 0.5, coords.y2 > coords.y1 ? coords.y2 : coords.y1);
24
- };
25
- this.drawHorizontalLine = (coords) => {
26
- this.drawLine(coords.x1 > coords.x2 ? coords.x2 : coords.x1, coords.y + 0.5, coords.x2 > coords.x1 ? coords.x2 : coords.x1, coords.y + 0.5);
27
- };
28
- this.drawLine = (x1, y1, x2, y2) => {
29
- const { ctx, aligningLineWidth, aligningLineColor, viewportTransform, zoom } = this;
30
- ctx.save();
31
- ctx.lineWidth = aligningLineWidth;
32
- ctx.strokeStyle = aligningLineColor;
33
- ctx.beginPath();
34
- ctx.moveTo(x1 * zoom + viewportTransform[4], y1 * zoom + viewportTransform[5]);
35
- ctx.lineTo(x2 * zoom + viewportTransform[4], y2 * zoom + viewportTransform[5]);
36
- ctx.stroke();
37
- ctx.restore();
38
- };
39
- this.isInRange = (v1, v2) => {
40
- const { aligningLineMargin } = this;
41
- v1 = Math.round(v1);
42
- v2 = Math.round(v2);
43
- for (let i = v1 - aligningLineMargin, len = v1 + aligningLineMargin; i <= len; i++) {
44
- if (i === v2) {
45
- return true;
46
- }
47
- }
48
- return false;
49
- };
50
- this.movingGuidelines = (target) => {
51
- const canvasObjects = this.handler.canvas.getObjects();
52
- const activeObjectCenter = target.getCenterPoint();
53
- const activeObjectLeft = activeObjectCenter.x;
54
- const activeObjectTop = activeObjectCenter.y;
55
- const activeObjectBoundingRect = target.getBoundingRect();
56
- const activeObjectHeight = activeObjectBoundingRect.height / this.viewportTransform[3];
57
- const activeObjectWidth = activeObjectBoundingRect.width / this.viewportTransform[0];
58
- let horizontalInTheRange = false;
59
- let verticalInTheRange = false;
60
- const { _currentTransform: transform } = this.handler.canvas;
61
- if (!transform) {
62
- return;
63
- }
64
- // It should be trivial to DRY this up by encapsulating (repeating) creation of x1, x2, y1, and y2 into functions,
65
- // but we're not doing it here for perf. reasons -- as this a function that's invoked on every mouse move
66
- for (let i = canvasObjects.length; i--;) {
67
- if (canvasObjects[i] === target ||
68
- canvasObjects[i].superType === 'port' ||
69
- canvasObjects[i].superType === 'link' ||
70
- !canvasObjects[i].evented) {
71
- continue;
72
- }
73
- const objectCenter = canvasObjects[i].getCenterPoint();
74
- const objectLeft = objectCenter.x;
75
- const objectTop = objectCenter.y;
76
- const objectBoundingRect = canvasObjects[i].getBoundingRect();
77
- const objectHeight = objectBoundingRect.height / this.viewportTransform[3];
78
- const objectWidth = objectBoundingRect.width / this.viewportTransform[0];
79
- // snap by the horizontal center line
80
- if (this.isInRange(objectLeft, activeObjectLeft)) {
81
- verticalInTheRange = true;
82
- if (canvasObjects[i].id === 'workarea') {
83
- const y1 = -5000;
84
- const y2 = 5000;
85
- this.verticalLines.push({
86
- x: objectLeft,
87
- y1,
88
- y2,
89
- });
90
- }
91
- else {
92
- this.verticalLines.push({
93
- x: objectLeft,
94
- y1: objectTop < activeObjectTop
95
- ? objectTop - objectHeight / 2 - this.aligningLineOffset
96
- : objectTop + objectHeight / 2 + this.aligningLineOffset,
97
- y2: activeObjectTop > objectTop
98
- ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
99
- : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
100
- });
101
- }
102
- target.setPositionByOrigin(new fabric_1.fabric.Point(objectLeft, activeObjectTop), 'center', 'center');
103
- }
104
- // snap by the left edge
105
- if (this.isInRange(objectLeft - objectWidth / 2, activeObjectLeft - activeObjectWidth / 2)) {
106
- verticalInTheRange = true;
107
- if (canvasObjects[i].id === 'workarea') {
108
- const workarea = canvasObjects[i];
109
- const y1 = -5000;
110
- const y2 = 5000;
111
- let x = objectLeft - objectWidth / 2;
112
- if (workarea.layout === 'fullscreen') {
113
- x = 0;
114
- }
115
- this.verticalLines.push({
116
- x,
117
- y1,
118
- y2,
119
- });
120
- }
121
- else {
122
- this.verticalLines.push({
123
- x: objectLeft - objectWidth / 2,
124
- y1: objectTop < activeObjectTop
125
- ? objectTop - objectHeight / 2 - this.aligningLineOffset
126
- : objectTop + objectHeight / 2 + this.aligningLineOffset,
127
- y2: activeObjectTop > objectTop
128
- ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
129
- : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
130
- });
131
- }
132
- target.setPositionByOrigin(new fabric_1.fabric.Point(objectLeft - objectWidth / 2 + activeObjectWidth / 2, activeObjectTop), 'center', 'center');
133
- }
134
- // snap by the right edge
135
- if (this.isInRange(objectLeft + objectWidth / 2, activeObjectLeft + activeObjectWidth / 2)) {
136
- verticalInTheRange = true;
137
- if (canvasObjects[i].id === 'workarea') {
138
- const workarea = canvasObjects[i];
139
- const y1 = -5000;
140
- const y2 = 5000;
141
- let x = objectLeft + objectWidth / 2;
142
- if (workarea.layout === 'fullscreen') {
143
- x = this.handler.canvas.getWidth();
144
- }
145
- this.verticalLines.push({
146
- x,
147
- y1,
148
- y2,
149
- });
150
- }
151
- else {
152
- this.verticalLines.push({
153
- x: objectLeft + objectWidth / 2,
154
- y1: objectTop < activeObjectTop
155
- ? objectTop - objectHeight / 2 - this.aligningLineOffset
156
- : objectTop + objectHeight / 2 + this.aligningLineOffset,
157
- y2: activeObjectTop > objectTop
158
- ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
159
- : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
160
- });
161
- }
162
- target.setPositionByOrigin(new fabric_1.fabric.Point(objectLeft + objectWidth / 2 - activeObjectWidth / 2, activeObjectTop), 'center', 'center');
163
- }
164
- // snap by the vertical center line
165
- if (this.isInRange(objectTop, activeObjectTop)) {
166
- horizontalInTheRange = true;
167
- if (canvasObjects[i].id === 'workarea') {
168
- const x1 = -5000;
169
- const x2 = 5000;
170
- this.horizontalLines.push({
171
- y: objectTop,
172
- x1,
173
- x2,
174
- });
175
- }
176
- else {
177
- this.horizontalLines.push({
178
- y: objectTop,
179
- x1: objectLeft < activeObjectLeft
180
- ? objectLeft - objectWidth / 2 - this.aligningLineOffset
181
- : objectLeft + objectWidth / 2 + this.aligningLineOffset,
182
- x2: activeObjectLeft > objectLeft
183
- ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
184
- : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
185
- });
186
- }
187
- target.setPositionByOrigin(new fabric_1.fabric.Point(activeObjectLeft, objectTop), 'center', 'center');
188
- }
189
- // snap by the top edge
190
- if (this.isInRange(objectTop - objectHeight / 2, activeObjectTop - activeObjectHeight / 2)) {
191
- horizontalInTheRange = true;
192
- if (canvasObjects[i].id === 'workarea') {
193
- const workarea = canvasObjects[i];
194
- const x1 = -5000;
195
- const x2 = 5000;
196
- let y = objectTop - objectHeight / 2;
197
- if (workarea.layout === 'fullscreen') {
198
- y = 0;
199
- }
200
- this.horizontalLines.push({
201
- y,
202
- x1,
203
- x2,
204
- });
205
- }
206
- else {
207
- this.horizontalLines.push({
208
- y: objectTop - objectHeight / 2,
209
- x1: objectLeft < activeObjectLeft
210
- ? objectLeft - objectWidth / 2 - this.aligningLineOffset
211
- : objectLeft + objectWidth / 2 + this.aligningLineOffset,
212
- x2: activeObjectLeft > objectLeft
213
- ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
214
- : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
215
- });
216
- }
217
- target.setPositionByOrigin(new fabric_1.fabric.Point(activeObjectLeft, objectTop - objectHeight / 2 + activeObjectHeight / 2), 'center', 'center');
218
- }
219
- // snap by the bottom edge
220
- if (this.isInRange(objectTop + objectHeight / 2, activeObjectTop + activeObjectHeight / 2)) {
221
- horizontalInTheRange = true;
222
- if (canvasObjects[i].id === 'workarea') {
223
- const workarea = canvasObjects[i];
224
- const x1 = -5000;
225
- const x2 = 5000;
226
- let y = objectTop + objectHeight / 2;
227
- if (workarea.layout === 'fullscreen') {
228
- y = this.handler.canvas.getHeight();
229
- }
230
- this.horizontalLines.push({
231
- y,
232
- x1,
233
- x2,
234
- });
235
- }
236
- else {
237
- this.horizontalLines.push({
238
- y: objectTop + objectHeight / 2,
239
- x1: objectLeft < activeObjectLeft
240
- ? objectLeft - objectWidth / 2 - this.aligningLineOffset
241
- : objectLeft + objectWidth / 2 + this.aligningLineOffset,
242
- x2: activeObjectLeft > objectLeft
243
- ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
244
- : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
245
- });
246
- }
247
- target.setPositionByOrigin(new fabric_1.fabric.Point(activeObjectLeft, objectTop + objectHeight / 2 - activeObjectHeight / 2), 'center', 'center');
248
- }
249
- }
250
- if (!horizontalInTheRange) {
251
- this.horizontalLines.length = 0;
252
- }
253
- if (!verticalInTheRange) {
254
- this.verticalLines.length = 0;
255
- }
256
- };
257
- this.scalingGuidelines = (_target) => {
258
- // TODO... object scaling guideline
259
- };
260
- this.handler = handler;
261
- }
262
- }
263
- exports.default = GuidelineHandler;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fabric_1 = require("fabric");
4
+ class GuidelineHandler {
5
+ constructor(handler) {
6
+ this.aligningLineOffset = 5;
7
+ this.aligningLineMargin = 4;
8
+ this.aligningLineWidth = 1;
9
+ this.aligningLineColor = 'rgb(255, 0, 0)';
10
+ this.zoom = 1;
11
+ /**
12
+ * Before the render
13
+ *
14
+ * @param {FabricEvent} _opt
15
+ */
16
+ this.beforeRender = (_opt) => {
17
+ this.handler.canvas.clearContext(this.handler.guidelineHandler.ctx);
18
+ };
19
+ /**
20
+ * After the render
21
+ *
22
+ * @param {FabricEvent} _opt
23
+ */
24
+ this.afterRender = (_opt) => {
25
+ for (let i = this.handler.guidelineHandler.verticalLines.length; i--;) {
26
+ this.handler.guidelineHandler.drawVerticalLine(this.handler.guidelineHandler.verticalLines[i]);
27
+ }
28
+ for (let i = this.handler.guidelineHandler.horizontalLines.length; i--;) {
29
+ this.handler.guidelineHandler.drawHorizontalLine(this.handler.guidelineHandler.horizontalLines[i]);
30
+ }
31
+ this.handler.guidelineHandler.verticalLines.length = 0;
32
+ this.handler.guidelineHandler.horizontalLines.length = 0;
33
+ };
34
+ this.drawVerticalLine = (coords) => {
35
+ this.drawLine(coords.x + 0.5, coords.y1 > coords.y2 ? coords.y2 : coords.y1, coords.x + 0.5, coords.y2 > coords.y1 ? coords.y2 : coords.y1);
36
+ };
37
+ this.drawHorizontalLine = (coords) => {
38
+ this.drawLine(coords.x1 > coords.x2 ? coords.x2 : coords.x1, coords.y + 0.5, coords.x2 > coords.x1 ? coords.x2 : coords.x1, coords.y + 0.5);
39
+ };
40
+ this.drawLine = (x1, y1, x2, y2) => {
41
+ const { ctx, aligningLineWidth, aligningLineColor, viewportTransform, zoom } = this;
42
+ ctx.save();
43
+ ctx.lineWidth = aligningLineWidth;
44
+ ctx.strokeStyle = aligningLineColor;
45
+ ctx.beginPath();
46
+ ctx.moveTo(x1 * zoom + viewportTransform[4], y1 * zoom + viewportTransform[5]);
47
+ ctx.lineTo(x2 * zoom + viewportTransform[4], y2 * zoom + viewportTransform[5]);
48
+ ctx.stroke();
49
+ ctx.restore();
50
+ };
51
+ this.isInRange = (v1, v2) => {
52
+ const { aligningLineMargin } = this;
53
+ v1 = Math.round(v1);
54
+ v2 = Math.round(v2);
55
+ for (let i = v1 - aligningLineMargin, len = v1 + aligningLineMargin; i <= len; i++) {
56
+ if (i === v2) {
57
+ return true;
58
+ }
59
+ }
60
+ return false;
61
+ };
62
+ this.movingGuidelines = (target) => {
63
+ const canvasObjects = this.handler.canvas.getObjects();
64
+ const activeObjectCenter = target.getCenterPoint();
65
+ const activeObjectLeft = activeObjectCenter.x;
66
+ const activeObjectTop = activeObjectCenter.y;
67
+ const activeObjectBoundingRect = target.getBoundingRect();
68
+ const activeObjectHeight = activeObjectBoundingRect.height / this.viewportTransform[3];
69
+ const activeObjectWidth = activeObjectBoundingRect.width / this.viewportTransform[0];
70
+ let horizontalInTheRange = false;
71
+ let verticalInTheRange = false;
72
+ const { _currentTransform: transform } = this.handler.canvas;
73
+ if (!transform) {
74
+ return;
75
+ }
76
+ // It should be trivial to DRY this up by encapsulating (repeating) creation of x1, x2, y1, and y2 into functions,
77
+ // but we're not doing it here for perf. reasons -- as this a function that's invoked on every mouse move
78
+ for (let i = canvasObjects.length; i--;) {
79
+ if (canvasObjects[i] === target ||
80
+ canvasObjects[i].superType === 'port' ||
81
+ canvasObjects[i].superType === 'link' ||
82
+ !canvasObjects[i].evented) {
83
+ continue;
84
+ }
85
+ const objectCenter = canvasObjects[i].getCenterPoint();
86
+ const objectLeft = objectCenter.x;
87
+ const objectTop = objectCenter.y;
88
+ const objectBoundingRect = canvasObjects[i].getBoundingRect();
89
+ const objectHeight = objectBoundingRect.height / this.viewportTransform[3];
90
+ const objectWidth = objectBoundingRect.width / this.viewportTransform[0];
91
+ // snap by the horizontal center line
92
+ if (this.isInRange(objectLeft, activeObjectLeft)) {
93
+ verticalInTheRange = true;
94
+ if (canvasObjects[i].id === 'workarea') {
95
+ const y1 = -5000;
96
+ const y2 = 5000;
97
+ this.verticalLines.push({
98
+ x: objectLeft,
99
+ y1,
100
+ y2,
101
+ });
102
+ }
103
+ else {
104
+ this.verticalLines.push({
105
+ x: objectLeft,
106
+ y1: objectTop < activeObjectTop
107
+ ? objectTop - objectHeight / 2 - this.aligningLineOffset
108
+ : objectTop + objectHeight / 2 + this.aligningLineOffset,
109
+ y2: activeObjectTop > objectTop
110
+ ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
111
+ : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
112
+ });
113
+ }
114
+ target.setPositionByOrigin(new fabric_1.fabric.Point(objectLeft, activeObjectTop), 'center', 'center');
115
+ }
116
+ // snap by the left edge
117
+ if (this.isInRange(objectLeft - objectWidth / 2, activeObjectLeft - activeObjectWidth / 2)) {
118
+ verticalInTheRange = true;
119
+ if (canvasObjects[i].id === 'workarea') {
120
+ const workarea = canvasObjects[i];
121
+ const y1 = -5000;
122
+ const y2 = 5000;
123
+ let x = objectLeft - objectWidth / 2;
124
+ if (workarea.layout === 'fullscreen') {
125
+ x = 0;
126
+ }
127
+ this.verticalLines.push({
128
+ x,
129
+ y1,
130
+ y2,
131
+ });
132
+ }
133
+ else {
134
+ this.verticalLines.push({
135
+ x: objectLeft - objectWidth / 2,
136
+ y1: objectTop < activeObjectTop
137
+ ? objectTop - objectHeight / 2 - this.aligningLineOffset
138
+ : objectTop + objectHeight / 2 + this.aligningLineOffset,
139
+ y2: activeObjectTop > objectTop
140
+ ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
141
+ : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
142
+ });
143
+ }
144
+ target.setPositionByOrigin(new fabric_1.fabric.Point(objectLeft - objectWidth / 2 + activeObjectWidth / 2, activeObjectTop), 'center', 'center');
145
+ }
146
+ // snap by the right edge
147
+ if (this.isInRange(objectLeft + objectWidth / 2, activeObjectLeft + activeObjectWidth / 2)) {
148
+ verticalInTheRange = true;
149
+ if (canvasObjects[i].id === 'workarea') {
150
+ const workarea = canvasObjects[i];
151
+ const y1 = -5000;
152
+ const y2 = 5000;
153
+ let x = objectLeft + objectWidth / 2;
154
+ if (workarea.layout === 'fullscreen') {
155
+ x = this.handler.canvas.getWidth();
156
+ }
157
+ this.verticalLines.push({
158
+ x,
159
+ y1,
160
+ y2,
161
+ });
162
+ }
163
+ else {
164
+ this.verticalLines.push({
165
+ x: objectLeft + objectWidth / 2,
166
+ y1: objectTop < activeObjectTop
167
+ ? objectTop - objectHeight / 2 - this.aligningLineOffset
168
+ : objectTop + objectHeight / 2 + this.aligningLineOffset,
169
+ y2: activeObjectTop > objectTop
170
+ ? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
171
+ : activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
172
+ });
173
+ }
174
+ target.setPositionByOrigin(new fabric_1.fabric.Point(objectLeft + objectWidth / 2 - activeObjectWidth / 2, activeObjectTop), 'center', 'center');
175
+ }
176
+ // snap by the vertical center line
177
+ if (this.isInRange(objectTop, activeObjectTop)) {
178
+ horizontalInTheRange = true;
179
+ if (canvasObjects[i].id === 'workarea') {
180
+ const x1 = -5000;
181
+ const x2 = 5000;
182
+ this.horizontalLines.push({
183
+ y: objectTop,
184
+ x1,
185
+ x2,
186
+ });
187
+ }
188
+ else {
189
+ this.horizontalLines.push({
190
+ y: objectTop,
191
+ x1: objectLeft < activeObjectLeft
192
+ ? objectLeft - objectWidth / 2 - this.aligningLineOffset
193
+ : objectLeft + objectWidth / 2 + this.aligningLineOffset,
194
+ x2: activeObjectLeft > objectLeft
195
+ ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
196
+ : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
197
+ });
198
+ }
199
+ target.setPositionByOrigin(new fabric_1.fabric.Point(activeObjectLeft, objectTop), 'center', 'center');
200
+ }
201
+ // snap by the top edge
202
+ if (this.isInRange(objectTop - objectHeight / 2, activeObjectTop - activeObjectHeight / 2)) {
203
+ horizontalInTheRange = true;
204
+ if (canvasObjects[i].id === 'workarea') {
205
+ const workarea = canvasObjects[i];
206
+ const x1 = -5000;
207
+ const x2 = 5000;
208
+ let y = objectTop - objectHeight / 2;
209
+ if (workarea.layout === 'fullscreen') {
210
+ y = 0;
211
+ }
212
+ this.horizontalLines.push({
213
+ y,
214
+ x1,
215
+ x2,
216
+ });
217
+ }
218
+ else {
219
+ this.horizontalLines.push({
220
+ y: objectTop - objectHeight / 2,
221
+ x1: objectLeft < activeObjectLeft
222
+ ? objectLeft - objectWidth / 2 - this.aligningLineOffset
223
+ : objectLeft + objectWidth / 2 + this.aligningLineOffset,
224
+ x2: activeObjectLeft > objectLeft
225
+ ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
226
+ : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
227
+ });
228
+ }
229
+ target.setPositionByOrigin(new fabric_1.fabric.Point(activeObjectLeft, objectTop - objectHeight / 2 + activeObjectHeight / 2), 'center', 'center');
230
+ }
231
+ // snap by the bottom edge
232
+ if (this.isInRange(objectTop + objectHeight / 2, activeObjectTop + activeObjectHeight / 2)) {
233
+ horizontalInTheRange = true;
234
+ if (canvasObjects[i].id === 'workarea') {
235
+ const workarea = canvasObjects[i];
236
+ const x1 = -5000;
237
+ const x2 = 5000;
238
+ let y = objectTop + objectHeight / 2;
239
+ if (workarea.layout === 'fullscreen') {
240
+ y = this.handler.canvas.getHeight();
241
+ }
242
+ this.horizontalLines.push({
243
+ y,
244
+ x1,
245
+ x2,
246
+ });
247
+ }
248
+ else {
249
+ this.horizontalLines.push({
250
+ y: objectTop + objectHeight / 2,
251
+ x1: objectLeft < activeObjectLeft
252
+ ? objectLeft - objectWidth / 2 - this.aligningLineOffset
253
+ : objectLeft + objectWidth / 2 + this.aligningLineOffset,
254
+ x2: activeObjectLeft > objectLeft
255
+ ? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
256
+ : activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
257
+ });
258
+ }
259
+ target.setPositionByOrigin(new fabric_1.fabric.Point(activeObjectLeft, objectTop + objectHeight / 2 - activeObjectHeight / 2), 'center', 'center');
260
+ }
261
+ }
262
+ if (!horizontalInTheRange) {
263
+ this.horizontalLines.length = 0;
264
+ }
265
+ if (!verticalInTheRange) {
266
+ this.verticalLines.length = 0;
267
+ }
268
+ };
269
+ this.scalingGuidelines = (_target) => {
270
+ // TODO... object scaling guideline
271
+ };
272
+ this.handler = handler;
273
+ this.initialize();
274
+ }
275
+ /**
276
+ * Initialize guideline handler
277
+ *
278
+ */
279
+ initialize() {
280
+ if (this.handler.guidelineOption.enabled) {
281
+ // @ts-ignore
282
+ this.handler.canvas.on({
283
+ 'before:render': this.beforeRender,
284
+ 'after:render': this.afterRender,
285
+ });
286
+ }
287
+ else {
288
+ this.handler.canvas.off({
289
+ 'before:render': this.beforeRender,
290
+ 'after:render': this.afterRender,
291
+ });
292
+ }
293
+ this.ctx = this.handler.canvas.getSelectionContext();
294
+ this.aligningLineOffset = 5;
295
+ this.aligningLineMargin = 4;
296
+ this.aligningLineWidth = 1;
297
+ this.aligningLineColor = 'rgb(255, 0, 0)';
298
+ this.viewportTransform = this.handler.canvas.viewportTransform;
299
+ this.zoom = 1;
300
+ this.verticalLines = [];
301
+ this.horizontalLines = [];
302
+ }
303
+ /**
304
+ * Destroy guideline handler
305
+ *
306
+ * @author salgum1114
307
+ */
308
+ destroy() {
309
+ this.handler.canvas.off({
310
+ 'before:render': this.beforeRender,
311
+ 'after:render': this.afterRender,
312
+ });
313
+ }
314
+ }
315
+ exports.default = GuidelineHandler;