kritzel-stencil 0.0.122 → 0.0.124
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/cjs/{index-BcrLbdO1.js → index-C05uAr89.js} +10 -4
- package/dist/cjs/index-C05uAr89.js.map +1 -0
- package/dist/cjs/{index-CFCyVs0_.js → index-UcX3pzju.js} +189 -98
- package/dist/cjs/index-UcX3pzju.js.map +1 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/kritzel-brush-style_18.cjs.entry.js +15 -15
- package/dist/cjs/kritzel-brush-style_18.cjs.entry.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/stencil.cjs.js +2 -2
- package/dist/cjs/stencil.cjs.js.map +1 -1
- package/dist/collection/classes/handlers/hover.handler.js +22 -0
- package/dist/collection/classes/handlers/hover.handler.js.map +1 -0
- package/dist/collection/classes/handlers/selection.handler.js +13 -17
- package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
- package/dist/collection/classes/objects/base-object.class.js +6 -0
- package/dist/collection/classes/objects/base-object.class.js.map +1 -1
- package/dist/collection/classes/objects/path.class.js +92 -23
- package/dist/collection/classes/objects/path.class.js.map +1 -1
- package/dist/collection/classes/objects/selection-box.class.js +2 -2
- package/dist/collection/classes/objects/selection-box.class.js.map +1 -1
- package/dist/collection/classes/objects/selection-group.class.js +2 -1
- package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
- package/dist/collection/classes/tools/eraser-tool.class.js +0 -1
- package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
- package/dist/collection/classes/tools/selection-tool.class.js +3 -0
- package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +9 -9
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
- package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +1 -1
- package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +1 -1
- package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +1 -1
- package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +1 -1
- package/dist/collection/interfaces/object.interface.js.map +1 -1
- package/dist/components/index.js +3 -3
- package/dist/components/kritzel-brush-style.js +1 -1
- package/dist/components/kritzel-color-palette.js +1 -1
- package/dist/components/kritzel-color.js +1 -1
- package/dist/components/kritzel-context-menu.js +1 -1
- package/dist/components/kritzel-control-brush-config.js +1 -1
- package/dist/components/kritzel-control-text-config.js +1 -1
- package/dist/components/kritzel-controls.js +1 -1
- package/dist/components/kritzel-cursor-trail.js +1 -1
- package/dist/components/kritzel-dropdown.js +1 -1
- package/dist/components/kritzel-editor.js +19 -19
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-font-family.js +1 -1
- package/dist/components/kritzel-font-size.js +1 -1
- package/dist/components/kritzel-font.js +1 -1
- package/dist/components/kritzel-icon.js +1 -1
- package/dist/components/kritzel-stroke-size.js +1 -1
- package/dist/components/kritzel-tooltip.js +1 -1
- package/dist/components/kritzel-utility-panel.js +1 -1
- package/dist/components/{p-CqPrOhzi.js → p-BOj_wqdw.js} +4 -4
- package/dist/components/{p-CqPrOhzi.js.map → p-BOj_wqdw.js.map} +1 -1
- package/dist/components/{p-CEYRFk55.js → p-BY8BWGge.js} +4 -4
- package/dist/components/{p-CEYRFk55.js.map → p-BY8BWGge.js.map} +1 -1
- package/dist/components/{p-D-Rf05Ov.js → p-Bn5P7YQn.js} +5 -5
- package/dist/components/{p-D-Rf05Ov.js.map → p-Bn5P7YQn.js.map} +1 -1
- package/dist/components/{p-CIb4IA9u.js → p-C9usqwb5.js} +5 -5
- package/dist/components/{p-CIb4IA9u.js.map → p-C9usqwb5.js.map} +1 -1
- package/dist/components/{p-gDLg_PJJ.js → p-CF8ziFc4.js} +4 -4
- package/dist/components/{p-gDLg_PJJ.js.map → p-CF8ziFc4.js.map} +1 -1
- package/dist/components/{p-CDpq9L_H.js → p-CiT5gBDh.js} +3 -3
- package/dist/components/{p-CDpq9L_H.js.map → p-CiT5gBDh.js.map} +1 -1
- package/dist/components/{p-D1oFXBAp.js → p-Cn_kantt.js} +5 -5
- package/dist/components/{p-D1oFXBAp.js.map → p-Cn_kantt.js.map} +1 -1
- package/dist/components/{p-Ch8eM2R8.js → p-Cnc43o9b.js} +151 -25
- package/dist/components/p-Cnc43o9b.js.map +1 -0
- package/dist/components/{p-DIu9OTyP.js → p-CneTqrgt.js} +18 -18
- package/dist/components/{p-DIu9OTyP.js.map → p-CneTqrgt.js.map} +1 -1
- package/dist/components/{p-B2wWYPH8.js → p-CtiROna-.js} +3 -3
- package/dist/components/{p-B2wWYPH8.js.map → p-CtiROna-.js.map} +1 -1
- package/dist/components/{p-D0L3GqSK.js → p-Cw2ATHMj.js} +3 -3
- package/dist/components/{p-D0L3GqSK.js.map → p-Cw2ATHMj.js.map} +1 -1
- package/dist/components/{p-CxmkJbeV.js → p-D0sLslUq.js} +3 -3
- package/dist/components/{p-CxmkJbeV.js.map → p-D0sLslUq.js.map} +1 -1
- package/dist/components/{p-dCaxwGmu.js → p-DJN0U8pI.js} +10 -4
- package/dist/components/p-DJN0U8pI.js.map +1 -0
- package/dist/components/{p-COPOzWCn.js → p-DJaVT2yR.js} +54 -89
- package/dist/components/p-DJaVT2yR.js.map +1 -0
- package/dist/components/{p-C3E9PtD3.js → p-DMAzUKo6.js} +10 -10
- package/dist/components/{p-C3E9PtD3.js.map → p-DMAzUKo6.js.map} +1 -1
- package/dist/components/{p-DbPbyRLO.js → p-DSLY0tr5.js} +5 -5
- package/dist/components/{p-DbPbyRLO.js.map → p-DSLY0tr5.js.map} +1 -1
- package/dist/components/{p--2FkikYE.js → p-DpiklJU9.js} +3 -3
- package/dist/components/{p--2FkikYE.js.map → p-DpiklJU9.js.map} +1 -1
- package/dist/components/{p--tElassI.js → p-NZJPrwJV.js} +3 -3
- package/dist/components/{p--tElassI.js.map → p-NZJPrwJV.js.map} +1 -1
- package/dist/components/{p-BSS4UREq.js → p-ubNAWsY_.js} +9 -9
- package/dist/components/{p-BSS4UREq.js.map → p-ubNAWsY_.js.map} +1 -1
- package/dist/esm/{index-BPFXWTBp.js → index-BGl8znzE.js} +10 -4
- package/dist/esm/index-BGl8znzE.js.map +1 -0
- package/dist/esm/{index-DYLW4hYm.js → index-DO2IiM_o.js} +189 -98
- package/dist/esm/index-DO2IiM_o.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/kritzel-brush-style_18.entry.js +15 -15
- package/dist/esm/kritzel-brush-style_18.entry.js.map +1 -1
- package/dist/esm/loader.js +2 -2
- package/dist/esm/stencil.js +3 -3
- package/dist/esm/stencil.js.map +1 -1
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/p-BGl8znzE.js +3 -0
- package/dist/stencil/p-BGl8znzE.js.map +1 -0
- package/dist/stencil/p-DO2IiM_o.js +2 -0
- package/dist/stencil/p-DO2IiM_o.js.map +1 -0
- package/dist/stencil/{p-fa584641.entry.js → p-c64f6589.entry.js} +2 -2
- package/dist/stencil/{p-fa584641.entry.js.map → p-c64f6589.entry.js.map} +1 -1
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/stencil/stencil.esm.js.map +1 -1
- package/dist/types/classes/handlers/hover.handler.d.ts +6 -0
- package/dist/types/classes/handlers/selection.handler.d.ts +1 -1
- package/dist/types/classes/objects/base-object.class.d.ts +2 -0
- package/dist/types/classes/objects/path.class.d.ts +5 -1
- package/dist/types/classes/tools/selection-tool.class.d.ts +2 -0
- package/dist/types/interfaces/object.interface.d.ts +3 -0
- package/package.json +5 -5
- package/dist/cjs/index-BcrLbdO1.js.map +0 -1
- package/dist/cjs/index-CFCyVs0_.js.map +0 -1
- package/dist/components/p-COPOzWCn.js.map +0 -1
- package/dist/components/p-Ch8eM2R8.js.map +0 -1
- package/dist/components/p-dCaxwGmu.js.map +0 -1
- package/dist/esm/index-BPFXWTBp.js.map +0 -1
- package/dist/esm/index-DYLW4hYm.js.map +0 -1
- package/dist/stencil/p-BPFXWTBp.js +0 -3
- package/dist/stencil/p-BPFXWTBp.js.map +0 -1
- package/dist/stencil/p-DYLW4hYm.js +0 -2
- package/dist/stencil/p-DYLW4hYm.js.map +0 -1
|
@@ -316,6 +316,59 @@ class ObjectHelper {
|
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
+
class KritzelGeometryHelper {
|
|
320
|
+
static doPolygonsIntersect(polygon1, polygon2) {
|
|
321
|
+
// 1. Convert polygons to array of points for easier processing
|
|
322
|
+
const points1 = [polygon1.bottomLeft, polygon1.bottomRight, polygon1.topRight, polygon1.topLeft];
|
|
323
|
+
const points2 = [polygon2.bottomLeft, polygon2.bottomRight, polygon2.topRight, polygon2.topLeft];
|
|
324
|
+
// 2. Check if any point of polygon1 is inside polygon2
|
|
325
|
+
for (const point of points1) {
|
|
326
|
+
if (this.isPointInPolygon(point, points2)) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// 3. Check if any point of polygon2 is inside polygon1
|
|
331
|
+
for (const point of points2) {
|
|
332
|
+
if (this.isPointInPolygon(point, points1)) {
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// 4. Check for edge intersections (more complex)
|
|
337
|
+
for (let i = 0; i < points1.length; i++) {
|
|
338
|
+
const p1a = points1[i];
|
|
339
|
+
const p1b = points1[(i + 1) % points1.length]; // Wrap around to the first point
|
|
340
|
+
for (let j = 0; j < points2.length; j++) {
|
|
341
|
+
const p2a = points2[j];
|
|
342
|
+
const p2b = points2[(j + 1) % points2.length];
|
|
343
|
+
if (this.intersectLines(p1a, p1b, p2a, p2b)) {
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return false; // No intersection found
|
|
349
|
+
}
|
|
350
|
+
static isPointInPolygon(point, polygon) {
|
|
351
|
+
let inside = false;
|
|
352
|
+
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
|
|
353
|
+
const xi = polygon[i].x, yi = polygon[i].y;
|
|
354
|
+
const xj = polygon[j].x, yj = polygon[j].y;
|
|
355
|
+
const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;
|
|
356
|
+
if (intersect)
|
|
357
|
+
inside = !inside;
|
|
358
|
+
}
|
|
359
|
+
return inside;
|
|
360
|
+
}
|
|
361
|
+
static intersectLines(p1a, p1b, p2a, p2b) {
|
|
362
|
+
const det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);
|
|
363
|
+
if (det === 0) {
|
|
364
|
+
return false; // Lines are parallel
|
|
365
|
+
}
|
|
366
|
+
const t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;
|
|
367
|
+
const u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;
|
|
368
|
+
return t >= 0 && t <= 1 && u >= 0 && u <= 1;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
319
372
|
class KritzelBaseObject {
|
|
320
373
|
get totalWidth() {
|
|
321
374
|
return this.width + this.padding * 2;
|
|
@@ -412,6 +465,7 @@ class KritzelBaseObject {
|
|
|
412
465
|
this.zIndex = 0;
|
|
413
466
|
this.isVisible = true;
|
|
414
467
|
this.isSelected = false;
|
|
468
|
+
this.isHovered = false;
|
|
415
469
|
this.isMounted = false;
|
|
416
470
|
this.isEditable = false;
|
|
417
471
|
this.isInteractive = false;
|
|
@@ -503,6 +557,10 @@ class KritzelBaseObject {
|
|
|
503
557
|
hitTest(_x, _y) {
|
|
504
558
|
return true; // Default implementation, can be overridden by subclasses
|
|
505
559
|
}
|
|
560
|
+
hitTestPolygon(polygon) {
|
|
561
|
+
const objectPolygon = this.rotatedPolygon;
|
|
562
|
+
return KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, polygon);
|
|
563
|
+
}
|
|
506
564
|
}
|
|
507
565
|
|
|
508
566
|
class KritzelText extends KritzelBaseObject {
|
|
@@ -681,12 +739,9 @@ class KritzelPath extends KritzelBaseObject {
|
|
|
681
739
|
this.scale = 1;
|
|
682
740
|
this.isVisible = true;
|
|
683
741
|
this.isDebugInfoVisible = true;
|
|
742
|
+
this._adjustedPoints = null;
|
|
684
743
|
this.options = config;
|
|
685
744
|
this.points = (_a = config === null || config === void 0 ? void 0 : config.points) !== null && _a !== void 0 ? _a : [];
|
|
686
|
-
this.adjustedPoints = this.points.map(([px, py]) => [
|
|
687
|
-
(px + this.options.translateX) / this.scale,
|
|
688
|
-
(py + this.options.translateY) / this.scale,
|
|
689
|
-
]);
|
|
690
745
|
this.translateX = (_b = config === null || config === void 0 ? void 0 : config.translateX) !== null && _b !== void 0 ? _b : 0;
|
|
691
746
|
this.translateY = (_c = config === null || config === void 0 ? void 0 : config.translateY) !== null && _c !== void 0 ? _c : 0;
|
|
692
747
|
this.scale = (_d = config === null || config === void 0 ? void 0 : config.scale) !== null && _d !== void 0 ? _d : 1;
|
|
@@ -702,13 +757,6 @@ class KritzelPath extends KritzelBaseObject {
|
|
|
702
757
|
object.id = object.generateId();
|
|
703
758
|
object.options = options;
|
|
704
759
|
object.points = (_a = options === null || options === void 0 ? void 0 : options.points) !== null && _a !== void 0 ? _a : [];
|
|
705
|
-
object.adjustedPoints = object.points.map(([px, py]) => {
|
|
706
|
-
var _a, _b;
|
|
707
|
-
return [
|
|
708
|
-
(px + (options === null || options === void 0 ? void 0 : options.translateX)) / ((_a = options === null || options === void 0 ? void 0 : options.scale) !== null && _a !== void 0 ? _a : 1),
|
|
709
|
-
(py + (options === null || options === void 0 ? void 0 : options.translateY)) / ((_b = options === null || options === void 0 ? void 0 : options.scale) !== null && _b !== void 0 ? _b : 1),
|
|
710
|
-
];
|
|
711
|
-
});
|
|
712
760
|
object.translateX = (_b = options === null || options === void 0 ? void 0 : options.translateX) !== null && _b !== void 0 ? _b : 0;
|
|
713
761
|
object.translateY = (_c = options === null || options === void 0 ? void 0 : options.translateY) !== null && _c !== void 0 ? _c : 0;
|
|
714
762
|
object.scale = (_d = options === null || options === void 0 ? void 0 : options.scale) !== null && _d !== void 0 ? _d : 1;
|
|
@@ -728,10 +776,6 @@ class KritzelPath extends KritzelBaseObject {
|
|
|
728
776
|
this.width = width;
|
|
729
777
|
this.height = height;
|
|
730
778
|
this.points = this.points.map(([x, y]) => [x * scaleX, y * scaleY]);
|
|
731
|
-
this.adjustedPoints = this.points.map(([px, py]) => [
|
|
732
|
-
(px + this.options.translateX) / this.scale,
|
|
733
|
-
(py + this.options.translateY) / this.scale,
|
|
734
|
-
]);
|
|
735
779
|
this.d = this.generateSvgPath();
|
|
736
780
|
this.width = Math.max(...this.points.map(p => p[0])) - Math.min(...this.points.map(p => p[0])) + this.strokeWidth;
|
|
737
781
|
this.height = Math.max(...this.points.map(p => p[1])) - Math.min(...this.points.map(p => p[1])) + this.strokeWidth;
|
|
@@ -739,21 +783,28 @@ class KritzelPath extends KritzelBaseObject {
|
|
|
739
783
|
this.y = Math.min(...this.points.map(p => p[1])) - this.strokeWidth / 2;
|
|
740
784
|
this.translateX = x;
|
|
741
785
|
this.translateY = y;
|
|
786
|
+
this._adjustedPoints = null;
|
|
742
787
|
}
|
|
743
788
|
rotate(value) {
|
|
744
|
-
|
|
745
|
-
this.
|
|
789
|
+
this.rotation = value;
|
|
790
|
+
this._adjustedPoints = null;
|
|
791
|
+
}
|
|
792
|
+
move(_startX, _startY, _endX, _endY) {
|
|
793
|
+
this._adjustedPoints = null;
|
|
746
794
|
}
|
|
747
795
|
hitTest(x, y) {
|
|
748
796
|
const halfStroke = this.strokeWidth / this.scale / 2;
|
|
749
|
-
if (this.
|
|
750
|
-
|
|
797
|
+
if (this._adjustedPoints === null) {
|
|
798
|
+
this._adjustedPoints = this.computeAdjustedPoints();
|
|
799
|
+
}
|
|
800
|
+
if (this._adjustedPoints.length === 1) {
|
|
801
|
+
const p1 = this._adjustedPoints[0];
|
|
751
802
|
const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p1[0], p1[1]);
|
|
752
803
|
return distance <= halfStroke;
|
|
753
804
|
}
|
|
754
|
-
for (let i = 0; i < this.
|
|
755
|
-
const p1 = this.
|
|
756
|
-
const p2 = this.
|
|
805
|
+
for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
|
|
806
|
+
const p1 = this._adjustedPoints[i];
|
|
807
|
+
const p2 = this._adjustedPoints[i + 1];
|
|
757
808
|
const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);
|
|
758
809
|
if (distance <= halfStroke) {
|
|
759
810
|
return true;
|
|
@@ -761,6 +812,80 @@ class KritzelPath extends KritzelBaseObject {
|
|
|
761
812
|
}
|
|
762
813
|
return false;
|
|
763
814
|
}
|
|
815
|
+
hitTestPolygon(polygon) {
|
|
816
|
+
const halfStroke = this.strokeWidth / this.scale / 2;
|
|
817
|
+
if (this._adjustedPoints === null) {
|
|
818
|
+
this._adjustedPoints = this.computeAdjustedPoints();
|
|
819
|
+
}
|
|
820
|
+
const polyPoints = [
|
|
821
|
+
{ x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },
|
|
822
|
+
{ x: polygon.bottomRight.x, y: polygon.bottomRight.y },
|
|
823
|
+
{ x: polygon.topRight.x, y: polygon.topRight.y },
|
|
824
|
+
{ x: polygon.topLeft.x, y: polygon.topLeft.y },
|
|
825
|
+
];
|
|
826
|
+
for (const [px, py] of this._adjustedPoints) {
|
|
827
|
+
if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {
|
|
828
|
+
return true;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
for (const pt of polyPoints) {
|
|
832
|
+
if (this.hitTest(pt.x, pt.y)) {
|
|
833
|
+
return true;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
|
|
837
|
+
const p1 = { x: this._adjustedPoints[i][0], y: this._adjustedPoints[i][1] };
|
|
838
|
+
const p2 = { x: this._adjustedPoints[i + 1][0], y: this._adjustedPoints[i + 1][1] };
|
|
839
|
+
for (let j = 0; j < polyPoints.length; j++) {
|
|
840
|
+
const q1 = polyPoints[j];
|
|
841
|
+
const q2 = polyPoints[(j + 1) % polyPoints.length];
|
|
842
|
+
if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {
|
|
843
|
+
return true;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
|
|
848
|
+
const p1 = this._adjustedPoints[i];
|
|
849
|
+
const p2 = this._adjustedPoints[i + 1];
|
|
850
|
+
for (let j = 0; j < polyPoints.length; j++) {
|
|
851
|
+
const q1 = polyPoints[j];
|
|
852
|
+
const q2 = polyPoints[(j + 1) % polyPoints.length];
|
|
853
|
+
const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1[0], p1[1], p2[0], p2[1]);
|
|
854
|
+
const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1[0], p1[1], p2[0], p2[1]);
|
|
855
|
+
const d3 = this.pointToLineSegmentDistance(p1[0], p1[1], q1.x, q1.y, q2.x, q2.y);
|
|
856
|
+
const d4 = this.pointToLineSegmentDistance(p2[0], p2[1], q1.x, q1.y, q2.x, q2.y);
|
|
857
|
+
const minD = Math.min(d1, d2, d3, d4);
|
|
858
|
+
if (minD <= halfStroke) {
|
|
859
|
+
return true;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
return false;
|
|
864
|
+
}
|
|
865
|
+
computeAdjustedPoints() {
|
|
866
|
+
var _a;
|
|
867
|
+
if (!((_a = this.points) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
868
|
+
return [];
|
|
869
|
+
}
|
|
870
|
+
const angle = this.rotation;
|
|
871
|
+
const cos = Math.cos(angle);
|
|
872
|
+
const sin = Math.sin(angle);
|
|
873
|
+
const xs = this.points.map(p => p[0]);
|
|
874
|
+
const ys = this.points.map(p => p[1]);
|
|
875
|
+
const pivot = {
|
|
876
|
+
x: (Math.min(...xs) + Math.max(...xs)) / 2,
|
|
877
|
+
y: (Math.min(...ys) + Math.max(...ys)) / 2,
|
|
878
|
+
};
|
|
879
|
+
const { x: cx, y: cy } = pivot;
|
|
880
|
+
const rotatedPoints = this.points.map(([x, y]) => {
|
|
881
|
+
const dx = x - cx;
|
|
882
|
+
const dy = y - cy;
|
|
883
|
+
return [cx + dx * cos - dy * sin, cy + dx * sin + dy * cos];
|
|
884
|
+
});
|
|
885
|
+
const deltaX = this.x - this.translateX;
|
|
886
|
+
const deltaY = this.y - this.translateY;
|
|
887
|
+
return rotatedPoints.map(([px, py]) => [(px + this.options.translateX - deltaX) / this.scale, (py + this.options.translateY - deltaY) / this.scale]);
|
|
888
|
+
}
|
|
764
889
|
pointToLineSegmentDistance(x, y, x1, y1, x2, y2) {
|
|
765
890
|
const A = x - x1;
|
|
766
891
|
const B = y - y1;
|
|
@@ -769,7 +894,8 @@ class KritzelPath extends KritzelBaseObject {
|
|
|
769
894
|
const dot = A * C + B * D;
|
|
770
895
|
const len_sq = C * C + D * D;
|
|
771
896
|
let param = -1;
|
|
772
|
-
if (len_sq !== 0) {
|
|
897
|
+
if (len_sq !== 0) {
|
|
898
|
+
// in case of 0 length line
|
|
773
899
|
param = dot / len_sq;
|
|
774
900
|
}
|
|
775
901
|
let xx, yy;
|
|
@@ -1121,7 +1247,6 @@ class KritzelEraserTool extends KritzelBaseTool {
|
|
|
1121
1247
|
const selectedObjects = this._store.getObjectsFromPointerEvent(event, '.object');
|
|
1122
1248
|
if (selectedObjects.length === 0)
|
|
1123
1249
|
return;
|
|
1124
|
-
console.log('selectedObjects', selectedObjects);
|
|
1125
1250
|
const x = this._store.state.pointerX;
|
|
1126
1251
|
const y = this._store.state.pointerY;
|
|
1127
1252
|
selectedObjects.forEach(selectedObject => {
|
|
@@ -1599,59 +1724,6 @@ class KritzelRotationHandler extends KritzelBaseHandler {
|
|
|
1599
1724
|
}
|
|
1600
1725
|
}
|
|
1601
1726
|
|
|
1602
|
-
class KritzelGeometryHelper {
|
|
1603
|
-
static doPolygonsIntersect(polygon1, polygon2) {
|
|
1604
|
-
// 1. Convert polygons to array of points for easier processing
|
|
1605
|
-
const points1 = [polygon1.bottomLeft, polygon1.bottomRight, polygon1.topRight, polygon1.topLeft];
|
|
1606
|
-
const points2 = [polygon2.bottomLeft, polygon2.bottomRight, polygon2.topRight, polygon2.topLeft];
|
|
1607
|
-
// 2. Check if any point of polygon1 is inside polygon2
|
|
1608
|
-
for (const point of points1) {
|
|
1609
|
-
if (this.isPointInPolygon(point, points2)) {
|
|
1610
|
-
return true;
|
|
1611
|
-
}
|
|
1612
|
-
}
|
|
1613
|
-
// 3. Check if any point of polygon2 is inside polygon1
|
|
1614
|
-
for (const point of points2) {
|
|
1615
|
-
if (this.isPointInPolygon(point, points1)) {
|
|
1616
|
-
return true;
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
// 4. Check for edge intersections (more complex)
|
|
1620
|
-
for (let i = 0; i < points1.length; i++) {
|
|
1621
|
-
const p1a = points1[i];
|
|
1622
|
-
const p1b = points1[(i + 1) % points1.length]; // Wrap around to the first point
|
|
1623
|
-
for (let j = 0; j < points2.length; j++) {
|
|
1624
|
-
const p2a = points2[j];
|
|
1625
|
-
const p2b = points2[(j + 1) % points2.length];
|
|
1626
|
-
if (this.intersectLines(p1a, p1b, p2a, p2b)) {
|
|
1627
|
-
return true;
|
|
1628
|
-
}
|
|
1629
|
-
}
|
|
1630
|
-
}
|
|
1631
|
-
return false; // No intersection found
|
|
1632
|
-
}
|
|
1633
|
-
static isPointInPolygon(point, polygon) {
|
|
1634
|
-
let inside = false;
|
|
1635
|
-
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
|
|
1636
|
-
const xi = polygon[i].x, yi = polygon[i].y;
|
|
1637
|
-
const xj = polygon[j].x, yj = polygon[j].y;
|
|
1638
|
-
const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;
|
|
1639
|
-
if (intersect)
|
|
1640
|
-
inside = !inside;
|
|
1641
|
-
}
|
|
1642
|
-
return inside;
|
|
1643
|
-
}
|
|
1644
|
-
static intersectLines(p1a, p1b, p2a, p2b) {
|
|
1645
|
-
const det = (p1b.x - p1a.x) * (p2b.y - p2a.y) - (p1b.y - p1a.y) * (p2b.x - p2a.x);
|
|
1646
|
-
if (det === 0) {
|
|
1647
|
-
return false; // Lines are parallel
|
|
1648
|
-
}
|
|
1649
|
-
const t = ((p2a.x - p1a.x) * (p2b.y - p2a.y) - (p2a.y - p1a.y) * (p2b.x - p2a.x)) / det;
|
|
1650
|
-
const u = -((p1a.x - p2a.x) * (p1b.y - p1a.y) - (p1a.y - p2a.y) * (p1b.x - p1a.x)) / det;
|
|
1651
|
-
return t >= 0 && t <= 1 && u >= 0 && u <= 1;
|
|
1652
|
-
}
|
|
1653
|
-
}
|
|
1654
|
-
|
|
1655
1727
|
class KrtizelSelectionBox extends KritzelBaseObject {
|
|
1656
1728
|
constructor() {
|
|
1657
1729
|
super(...arguments);
|
|
@@ -1664,8 +1736,8 @@ class KrtizelSelectionBox extends KritzelBaseObject {
|
|
|
1664
1736
|
object.id = object.generateId();
|
|
1665
1737
|
object.scale = store.state.scale;
|
|
1666
1738
|
object.zIndex = 99999;
|
|
1667
|
-
object.backgroundColor = 'var(--kritzel-selection-box-background-color, rgba(
|
|
1668
|
-
object.borderColor = 'var(--kritzel-selection-box-border-color, rgba(
|
|
1739
|
+
object.backgroundColor = 'var(--kritzel-selection-box-background-color, rgba(0, 122, 255, 0.2))';
|
|
1740
|
+
object.borderColor = 'var(--kritzel-selection-box-border-color, rgba(0, 122, 255, 0.5))';
|
|
1669
1741
|
object.borderWidth = 2;
|
|
1670
1742
|
object.height = 0;
|
|
1671
1743
|
object.width = 0;
|
|
@@ -1742,8 +1814,10 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
1742
1814
|
if (event.pointerType === 'mouse') {
|
|
1743
1815
|
if (KritzelEventHelper.isLeftClick(event) && this._store.state.isSelecting) {
|
|
1744
1816
|
if (this.isSelectionClick) {
|
|
1745
|
-
this.
|
|
1746
|
-
this.
|
|
1817
|
+
const x = this._store.state.pointerX;
|
|
1818
|
+
const y = this._store.state.pointerY;
|
|
1819
|
+
const selectedObject = this._store.getObjectsFromPointerEvent(event, '.object').find(obj => obj.hitTest(x, y));
|
|
1820
|
+
this.addObjectToSelectionGroup(selectedObject);
|
|
1747
1821
|
this.removeSelectionBox();
|
|
1748
1822
|
}
|
|
1749
1823
|
if (this.isSelectionDrag) {
|
|
@@ -1757,8 +1831,10 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
1757
1831
|
clearTimeout(this.touchStartTimeout);
|
|
1758
1832
|
if (this._store.state.isSelecting) {
|
|
1759
1833
|
if (this.isSelectionClick) {
|
|
1760
|
-
this.
|
|
1761
|
-
this.
|
|
1834
|
+
const x = this._store.state.pointerX;
|
|
1835
|
+
const y = this._store.state.pointerY;
|
|
1836
|
+
const selectedObject = this._store.getObjectsFromPointerEvent(event, '.object').find(obj => obj.hitTest(x, y));
|
|
1837
|
+
this.addObjectToSelectionGroup(selectedObject);
|
|
1762
1838
|
this.removeSelectionBox();
|
|
1763
1839
|
}
|
|
1764
1840
|
if (this.isSelectionDrag) {
|
|
@@ -1852,23 +1928,16 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
1852
1928
|
updateSelectedObjects() {
|
|
1853
1929
|
this._store.allObjects
|
|
1854
1930
|
.filter(o => !(o instanceof KrtizelSelectionBox))
|
|
1855
|
-
.forEach(object =>
|
|
1856
|
-
const objectPolygon = object.rotatedPolygon;
|
|
1857
|
-
const selectionBoxPolygon = this._store.state.selectionBox.rotatedPolygon;
|
|
1858
|
-
object.isSelected = KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, selectionBoxPolygon);
|
|
1859
|
-
});
|
|
1931
|
+
.forEach(object => (object.isSelected = object.hitTestPolygon(this._store.state.selectionBox.rotatedPolygon)));
|
|
1860
1932
|
}
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
const selectedObject = selectedObjects[index];
|
|
1864
|
-
if (!selectedObject) {
|
|
1933
|
+
addObjectToSelectionGroup(object) {
|
|
1934
|
+
if (!object) {
|
|
1865
1935
|
return;
|
|
1866
1936
|
}
|
|
1867
|
-
selectedObjects.forEach(o => (o.isSelected = false));
|
|
1868
1937
|
this._store.state.selectionGroup = KritzelSelectionGroup.create(this._store);
|
|
1869
|
-
this._store.state.selectionGroup.addOrRemove(
|
|
1938
|
+
this._store.state.selectionGroup.addOrRemove(object);
|
|
1870
1939
|
this._store.state.selectionGroup.isSelected = true;
|
|
1871
|
-
this._store.state.selectionGroup.rotation =
|
|
1940
|
+
this._store.state.selectionGroup.rotation = object.rotation;
|
|
1872
1941
|
this._store.history.executeCommand(new AddSelectionGroupCommand(this._store, this, this._store.state.selectionGroup));
|
|
1873
1942
|
}
|
|
1874
1943
|
addSelectedObjectsToSelectionGroup() {
|
|
@@ -1889,11 +1958,31 @@ class KritzelSelectionHandler extends KritzelBaseHandler {
|
|
|
1889
1958
|
}
|
|
1890
1959
|
}
|
|
1891
1960
|
|
|
1961
|
+
class KritzelHoverHandler extends KritzelBaseHandler {
|
|
1962
|
+
constructor(store) {
|
|
1963
|
+
super(store);
|
|
1964
|
+
}
|
|
1965
|
+
handlePointerMove(event) {
|
|
1966
|
+
if (event.pointerType === 'mouse') {
|
|
1967
|
+
const hoveredObject = this._store.getObjectFromPointerEvent(event, '.object');
|
|
1968
|
+
if (!hoveredObject)
|
|
1969
|
+
return;
|
|
1970
|
+
const x = this._store.state.pointerX;
|
|
1971
|
+
const y = this._store.state.pointerY;
|
|
1972
|
+
hoveredObject.isHovered = hoveredObject.hitTest(x, y);
|
|
1973
|
+
if (hoveredObject.isHovered) {
|
|
1974
|
+
console.log(hoveredObject.id);
|
|
1975
|
+
}
|
|
1976
|
+
}
|
|
1977
|
+
}
|
|
1978
|
+
}
|
|
1979
|
+
|
|
1892
1980
|
class KritzelSelectionTool extends KritzelBaseTool {
|
|
1893
1981
|
constructor(store) {
|
|
1894
1982
|
super(store);
|
|
1895
1983
|
this.selectionHandler = new KritzelSelectionHandler(this._store);
|
|
1896
1984
|
this.moveHandler = new KritzelMoveHandler(this._store);
|
|
1985
|
+
this.hoverHandler = new KritzelHoverHandler(this._store);
|
|
1897
1986
|
this.resizeHandler = new KritzelResizeHandler(this._store);
|
|
1898
1987
|
this.rotationHandler = new KritzelRotationHandler(this._store);
|
|
1899
1988
|
}
|
|
@@ -1956,6 +2045,7 @@ class KritzelSelectionTool extends KritzelBaseTool {
|
|
|
1956
2045
|
}
|
|
1957
2046
|
if (event.pointerType === 'mouse') {
|
|
1958
2047
|
this.moveHandler.handlePointerMove(event);
|
|
2048
|
+
this.hoverHandler.handlePointerMove(event);
|
|
1959
2049
|
this.selectionHandler.handlePointerMove(event);
|
|
1960
2050
|
this.resizeHandler.handlePointerMove(event);
|
|
1961
2051
|
this.rotationHandler.handlePointerMove(event);
|
|
@@ -2149,6 +2239,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
2149
2239
|
this.objects.forEach(obj => {
|
|
2150
2240
|
obj.translateX += deltaX;
|
|
2151
2241
|
obj.translateY += deltaY;
|
|
2242
|
+
obj.move(startX, startY, endX, endY);
|
|
2152
2243
|
this._store.state.objectsOctree.update(obj);
|
|
2153
2244
|
});
|
|
2154
2245
|
this.unchangedObjects.forEach(obj => {
|
|
@@ -2187,7 +2278,7 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
2187
2278
|
const rotatedY = sin * offsetX + cos * offsetY;
|
|
2188
2279
|
child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;
|
|
2189
2280
|
child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;
|
|
2190
|
-
child.
|
|
2281
|
+
child.rotate(this.objects.length === 1 ? value : value + unchangedChild.rotation);
|
|
2191
2282
|
this._store.state.objectsOctree.update(child);
|
|
2192
2283
|
});
|
|
2193
2284
|
}
|
|
@@ -2429,6 +2520,6 @@ const DEFAULT_TEXT_CONFIG = {
|
|
|
2429
2520
|
};
|
|
2430
2521
|
|
|
2431
2522
|
export { AddObjectCommand as A, BatchCommand as B, DEFAULT_BRUSH_CONFIG as D, KritzelBrushTool as K, RemoveSelectionGroupCommand as R, KritzelTextTool as a, KritzelMouseButton as b, KritzelSelectionTool as c, KritzelEraserTool as d, DEFAULT_TEXT_CONFIG as e, KritzelImageTool as f, KritzelEventHelper as g, KritzelBaseCommand as h, KritzelSelectionGroup as i, KrtizelSelectionBox as j, RemoveObjectCommand as k, AddSelectionGroupCommand as l, KritzelToolRegistry as m, KritzelBaseHandler as n, KritzelBaseTool as o, KritzelKeyboardHelper as p, KritzelText as q, KritzelPath as r, KritzelImage as s };
|
|
2432
|
-
//# sourceMappingURL=index-
|
|
2523
|
+
//# sourceMappingURL=index-DO2IiM_o.js.map
|
|
2433
2524
|
|
|
2434
|
-
//# sourceMappingURL=index-
|
|
2525
|
+
//# sourceMappingURL=index-DO2IiM_o.js.map
|