Replace getElementAbsoluteXY with getElementAbsoluteCoords

This commit is contained in:
Gasim Gasimzada 2020-01-07 17:28:04 +04:00
parent 8593273775
commit b75d9381da
8 changed files with 111 additions and 73 deletions

View file

@ -0,0 +1,67 @@
import { getElementAbsoluteCoords } from "./bounds";
import { ExcalidrawElement } from "./types";
const _ce = ({ x, y, w, h }: { x: number; y: number; w: number; h: number }) =>
({
type: "test",
strokeColor: "#000",
backgroundColor: "#000",
fillStyle: "solid",
strokeWidth: 1,
roughness: 1,
opacity: 1,
x,
y,
width: w,
height: h
} as ExcalidrawElement);
describe("getElementAbsoluteCoords", () => {
it("test x1 coordinate if width is positive or zero", () => {
const [x1] = getElementAbsoluteCoords(_ce({ x: 10, y: 0, w: 10, h: 0 }));
expect(x1).toEqual(10);
});
it("test x1 coordinate if width is negative", () => {
const [x1] = getElementAbsoluteCoords(_ce({ x: 20, y: 0, w: -10, h: 0 }));
expect(x1).toEqual(10);
});
it("test x2 coordinate if width is positive or zero", () => {
const [, , x2] = getElementAbsoluteCoords(
_ce({ x: 10, y: 0, w: 10, h: 0 })
);
expect(x2).toEqual(20);
});
it("test x2 coordinate if width is negative", () => {
const [, , x2] = getElementAbsoluteCoords(
_ce({ x: 10, y: 0, w: -10, h: 0 })
);
expect(x2).toEqual(10);
});
it("test y1 coordinate if height is positive or zero", () => {
const [, y1] = getElementAbsoluteCoords(_ce({ x: 0, y: 10, w: 0, h: 10 }));
expect(y1).toEqual(10);
});
it("test y1 coordinate if height is negative", () => {
const [, y1] = getElementAbsoluteCoords(_ce({ x: 0, y: 20, w: 0, h: -10 }));
expect(y1).toEqual(10);
});
it("test y2 coordinate if height is positive or zero", () => {
const [, , , y2] = getElementAbsoluteCoords(
_ce({ x: 0, y: 10, w: 0, h: 10 })
);
expect(y2).toEqual(20);
});
it("test y2 coordinate if height is negative", () => {
const [, , , y2] = getElementAbsoluteCoords(
_ce({ x: 0, y: 10, w: 0, h: -10 })
);
expect(y2).toEqual(10);
});
});

View file

@ -5,17 +5,13 @@ import { rotate } from "../math";
// This set of functions retrieves the absolute position of the 4 points. // This set of functions retrieves the absolute position of the 4 points.
// We can't just always normalize it since we need to remember the fact that an arrow // We can't just always normalize it since we need to remember the fact that an arrow
// is pointing left or right. // is pointing left or right.
export function getElementAbsoluteX1(element: ExcalidrawElement) { export function getElementAbsoluteCoords(element: ExcalidrawElement) {
return element.width >= 0 ? element.x : element.x + element.width; return [
} element.width >= 0 ? element.x : element.x + element.width, // x1
export function getElementAbsoluteX2(element: ExcalidrawElement) { element.height >= 0 ? element.y : element.y + element.height, // y1
return element.width >= 0 ? element.x + element.width : element.x; element.width >= 0 ? element.x + element.width : element.x, // x2
} element.height >= 0 ? element.y + element.height : element.y // y2
export function getElementAbsoluteY1(element: ExcalidrawElement) { ];
return element.height >= 0 ? element.y : element.y + element.height;
}
export function getElementAbsoluteY2(element: ExcalidrawElement) {
return element.height >= 0 ? element.y + element.height : element.y;
} }
export function getDiamondPoints(element: ExcalidrawElement) { export function getDiamondPoints(element: ExcalidrawElement) {

View file

@ -2,12 +2,9 @@ import { distanceBetweenPointAndSegment } from "../math";
import { ExcalidrawElement } from "./types"; import { ExcalidrawElement } from "./types";
import { import {
getElementAbsoluteX1,
getElementAbsoluteX2,
getElementAbsoluteY1,
getElementAbsoluteY2,
getArrowPoints, getArrowPoints,
getDiamondPoints getDiamondPoints,
getElementAbsoluteCoords
} from "./bounds"; } from "./bounds";
export function hitTest( export function hitTest(
@ -55,10 +52,7 @@ export function hitTest(
return Math.hypot(a * tx - px, b * ty - py) < lineThreshold; return Math.hypot(a * tx - px, b * ty - py) < lineThreshold;
} else if (element.type === "rectangle") { } else if (element.type === "rectangle") {
const x1 = getElementAbsoluteX1(element); const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
const x2 = getElementAbsoluteX2(element);
const y1 = getElementAbsoluteY1(element);
const y2 = getElementAbsoluteY2(element);
// (x1, y1) --A-- (x2, y1) // (x1, y1) --A-- (x2, y1)
// |D |B // |D |B
@ -109,10 +103,7 @@ export function hitTest(
distanceBetweenPointAndSegment(x, y, x4, y4, x2, y2) < lineThreshold distanceBetweenPointAndSegment(x, y, x4, y4, x2, y2) < lineThreshold
); );
} else if (element.type === "text") { } else if (element.type === "text") {
const x1 = getElementAbsoluteX1(element); const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
const x2 = getElementAbsoluteX2(element);
const y1 = getElementAbsoluteY1(element);
const y2 = getElementAbsoluteY2(element);
return x >= x1 && x <= x2 && y >= y1 && y <= y2; return x >= x1 && x <= x2 && y >= y1 && y <= y2;
} else if (element.type === "selection") { } else if (element.type === "selection") {

View file

@ -1,9 +1,6 @@
export { newElement } from "./newElement"; export { newElement } from "./newElement";
export { export {
getElementAbsoluteX1, getElementAbsoluteCoords,
getElementAbsoluteX2,
getElementAbsoluteY1,
getElementAbsoluteY2,
getDiamondPoints, getDiamondPoints,
getArrowPoints getArrowPoints
} from "./bounds"; } from "./bounds";

View file

@ -1,13 +1,7 @@
import { RoughCanvas } from "roughjs/bin/canvas"; import { RoughCanvas } from "roughjs/bin/canvas";
import { ExcalidrawElement } from "../element/types"; import { ExcalidrawElement } from "../element/types";
import { import { getElementAbsoluteCoords, handlerRectangles } from "../element";
getElementAbsoluteX1,
getElementAbsoluteX2,
getElementAbsoluteY1,
getElementAbsoluteY2,
handlerRectangles
} from "../element";
import { roundRect } from "../scene/roundRect"; import { roundRect } from "../scene/roundRect";
import { SceneState } from "../scene/types"; import { SceneState } from "../scene/types";
@ -65,10 +59,12 @@ export function renderScene(
selectedElements.forEach(element => { selectedElements.forEach(element => {
const margin = 4; const margin = 4;
const elementX1 = getElementAbsoluteX1(element); const [
const elementX2 = getElementAbsoluteX2(element); elementX1,
const elementY1 = getElementAbsoluteY1(element); elementY1,
const elementY2 = getElementAbsoluteY2(element); elementX2,
elementY2
] = getElementAbsoluteCoords(element);
const lineDash = context.getLineDash(); const lineDash = context.getLineDash();
context.setLineDash([8, 4]); context.setLineDash([8, 4]);
context.strokeRect( context.strokeRect(

View file

@ -2,12 +2,7 @@ import rough from "roughjs/bin/wrappers/rough";
import { ExcalidrawElement } from "../element/types"; import { ExcalidrawElement } from "../element/types";
import { import { getElementAbsoluteCoords } from "../element";
getElementAbsoluteX1,
getElementAbsoluteX2,
getElementAbsoluteY1,
getElementAbsoluteY2
} from "../element";
import { renderScene } from "../renderer"; import { renderScene } from "../renderer";
import { AppState } from "../types"; import { AppState } from "../types";
@ -93,10 +88,11 @@ export function exportAsPNG(
let subCanvasY2 = 0; let subCanvasY2 = 0;
elements.forEach(element => { elements.forEach(element => {
subCanvasX1 = Math.min(subCanvasX1, getElementAbsoluteX1(element)); const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
subCanvasX2 = Math.max(subCanvasX2, getElementAbsoluteX2(element)); subCanvasX1 = Math.min(subCanvasX1, x1);
subCanvasY1 = Math.min(subCanvasY1, getElementAbsoluteY1(element)); subCanvasY1 = Math.min(subCanvasY1, y1);
subCanvasY2 = Math.max(subCanvasY2, getElementAbsoluteY2(element)); subCanvasX2 = Math.max(subCanvasX2, x2);
subCanvasY2 = Math.max(subCanvasY2, y2);
}); });
function distance(x: number, y: number) { function distance(x: number, y: number) {

View file

@ -1,10 +1,5 @@
import { ExcalidrawElement } from "../element/types"; import { ExcalidrawElement } from "../element/types";
import { import { getElementAbsoluteCoords } from "../element";
getElementAbsoluteX1,
getElementAbsoluteX2,
getElementAbsoluteY1,
getElementAbsoluteY2
} from "../element";
const SCROLLBAR_MIN_SIZE = 15; const SCROLLBAR_MIN_SIZE = 15;
const SCROLLBAR_MARGIN = 4; const SCROLLBAR_MARGIN = 4;
@ -24,10 +19,11 @@ export function getScrollBars(
let maxY = 0; let maxY = 0;
elements.forEach(element => { elements.forEach(element => {
minX = Math.min(minX, getElementAbsoluteX1(element)); const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
maxX = Math.max(maxX, getElementAbsoluteX2(element)); minX = Math.min(minX, x1);
minY = Math.min(minY, getElementAbsoluteY1(element)); minY = Math.min(minY, y1);
maxY = Math.max(maxY, getElementAbsoluteY2(element)); maxX = Math.max(maxX, x2);
maxY = Math.max(maxY, y2);
}); });
minX += scrollX; minX += scrollX;

View file

@ -1,24 +1,23 @@
import { ExcalidrawElement } from "../element/types"; import { ExcalidrawElement } from "../element/types";
import { import { getElementAbsoluteCoords } from "../element";
getElementAbsoluteX1,
getElementAbsoluteX2,
getElementAbsoluteY1,
getElementAbsoluteY2
} from "../element";
export function setSelection( export function setSelection(
elements: ExcalidrawElement[], elements: ExcalidrawElement[],
selection: ExcalidrawElement selection: ExcalidrawElement
) { ) {
const selectionX1 = getElementAbsoluteX1(selection); const [
const selectionX2 = getElementAbsoluteX2(selection); selectionX1,
const selectionY1 = getElementAbsoluteY1(selection); selectionY1,
const selectionY2 = getElementAbsoluteY2(selection); selectionX2,
selectionY2
] = getElementAbsoluteCoords(selection);
elements.forEach(element => { elements.forEach(element => {
const elementX1 = getElementAbsoluteX1(element); const [
const elementX2 = getElementAbsoluteX2(element); elementX1,
const elementY1 = getElementAbsoluteY1(element); elementY1,
const elementY2 = getElementAbsoluteY2(element); elementX2,
elementY2
] = getElementAbsoluteCoords(element);
element.isSelected = element.isSelected =
element.type !== "selection" && element.type !== "selection" &&
selectionX1 <= elementX1 && selectionX1 <= elementX1 &&