mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
Separate more things
This commit is contained in:
parent
70feced695
commit
aa873234ad
11 changed files with 64 additions and 114 deletions
|
@ -1,6 +1,6 @@
|
||||||
import { isDarwin } from "./constants";
|
import { isDarwin } from "./constants";
|
||||||
|
|
||||||
import type { ValueOf } from "./utility-types";
|
import type { ValueOf } from "../excalidraw/utility-types";
|
||||||
|
|
||||||
export const CODES = {
|
export const CODES = {
|
||||||
EQUAL: "Equal",
|
EQUAL: "Equal",
|
|
@ -1,6 +1,6 @@
|
||||||
import { sanitizeUrl } from "@braintree/sanitize-url";
|
import { sanitizeUrl } from "@braintree/sanitize-url";
|
||||||
|
|
||||||
import { escapeDoubleQuotes } from "../utils";
|
import { escapeDoubleQuotes } from "./utils";
|
||||||
|
|
||||||
export const normalizeLink = (link: string) => {
|
export const normalizeLink = (link: string) => {
|
||||||
link = link.trim();
|
link = link.trim();
|
|
@ -1245,3 +1245,60 @@ export const escapeDoubleQuotes = (str: string) => {
|
||||||
|
|
||||||
export const castArray = <T>(value: T | T[]): T[] =>
|
export const castArray = <T>(value: T | T[]): T[] =>
|
||||||
Array.isArray(value) ? value : [value];
|
Array.isArray(value) ? value : [value];
|
||||||
|
|
||||||
|
|
||||||
|
// TODO_SEP: perhaps could be refactored away?
|
||||||
|
|
||||||
|
// TODO: Rounding this point causes some shake when free drawing
|
||||||
|
export const getGridPoint = (
|
||||||
|
x: number,
|
||||||
|
y: number,
|
||||||
|
gridSize: NullableGridSize,
|
||||||
|
): [number, number] => {
|
||||||
|
if (gridSize) {
|
||||||
|
return [
|
||||||
|
Math.round(x / gridSize) * gridSize,
|
||||||
|
Math.round(y / gridSize) * gridSize,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return [x, y];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const elementsAreInSameGroup = (
|
||||||
|
elements: readonly ExcalidrawElement[],
|
||||||
|
) => {
|
||||||
|
const allGroups = elements.flatMap((element) => element.groupIds);
|
||||||
|
const groupCount = new Map<string, number>();
|
||||||
|
let maxGroup = 0;
|
||||||
|
|
||||||
|
for (const group of allGroups) {
|
||||||
|
groupCount.set(group, (groupCount.get(group) ?? 0) + 1);
|
||||||
|
if (groupCount.get(group)! > maxGroup) {
|
||||||
|
maxGroup = groupCount.get(group)!;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return maxGroup === elements.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const isInGroup = (element: NonDeletedExcalidrawElement) => {
|
||||||
|
return element.groupIds.length > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getNewGroupIdsForDuplication = (
|
||||||
|
groupIds: ExcalidrawElement["groupIds"],
|
||||||
|
editingGroupId: AppState["editingGroupId"],
|
||||||
|
mapper: (groupId: GroupId) => GroupId,
|
||||||
|
) => {
|
||||||
|
const copy = [...groupIds];
|
||||||
|
const positionOfEditingGroupId = editingGroupId
|
||||||
|
? groupIds.indexOf(editingGroupId)
|
||||||
|
: -1;
|
||||||
|
const endIndex =
|
||||||
|
positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;
|
||||||
|
for (let index = 0; index < endIndex; index++) {
|
||||||
|
copy[index] = mapper(copy[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy;
|
||||||
|
};
|
||||||
|
|
|
@ -16,8 +16,8 @@ import {
|
||||||
getContainerElement,
|
getContainerElement,
|
||||||
} from "./element/textElement";
|
} from "./element/textElement";
|
||||||
import { isFrameElement, isFrameLikeElement } from "./element/typeChecks";
|
import { isFrameElement, isFrameLikeElement } from "./element/typeChecks";
|
||||||
import { getElementsInGroup, selectGroupsFromGivenElements } from "./groups";
|
import { getElementsInGroup, selectGroupsFromGivenElements } from "../excalidraw/groups";
|
||||||
import { getElementsWithinSelection, getSelectedElements } from "./scene";
|
import { getElementsWithinSelection, getSelectedElements } from "../excalidraw/scene";
|
||||||
import { arrayToMap } from "./utils";
|
import { arrayToMap } from "./utils";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
|
@ -28,13 +28,13 @@ import type {
|
||||||
NonDeleted,
|
NonDeleted,
|
||||||
NonDeletedExcalidrawElement,
|
NonDeletedExcalidrawElement,
|
||||||
} from "./element/types";
|
} from "./element/types";
|
||||||
import type { ExcalidrawElementsIncludingDeleted } from "./scene/Scene";
|
import type { ExcalidrawElementsIncludingDeleted } from "../excalidraw/scene/Scene";
|
||||||
import type {
|
import type {
|
||||||
AppClassProperties,
|
AppClassProperties,
|
||||||
AppState,
|
AppState,
|
||||||
StaticCanvasAppState,
|
StaticCanvasAppState,
|
||||||
} from "./types";
|
} from "../excalidraw/types";
|
||||||
import type { ReadonlySetLike } from "./utility-types";
|
import type { ReadonlySetLike } from "../excalidraw/utility-types";
|
||||||
|
|
||||||
// --------------------------- Frame State ------------------------------------
|
// --------------------------- Frame State ------------------------------------
|
||||||
export const bindElementsToFramesAfterDuplication = (
|
export const bindElementsToFramesAfterDuplication = (
|
||||||
|
@ -99,59 +99,6 @@ export const getElementsCompletelyInFrame = (
|
||||||
element.frameId === frame.id,
|
element.frameId === frame.id,
|
||||||
);
|
);
|
||||||
|
|
||||||
export const isElementContainingFrame = (
|
|
||||||
element: ExcalidrawElement,
|
|
||||||
frame: ExcalidrawFrameLikeElement,
|
|
||||||
elementsMap: ElementsMap,
|
|
||||||
) => {
|
|
||||||
return getElementsWithinSelection([frame], element, elementsMap).some(
|
|
||||||
(e) => e.id === frame.id,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getElementsIntersectingFrame = (
|
|
||||||
elements: readonly ExcalidrawElement[],
|
|
||||||
frame: ExcalidrawFrameLikeElement,
|
|
||||||
) => {
|
|
||||||
const elementsMap = arrayToMap(elements);
|
|
||||||
return elements.filter((element) =>
|
|
||||||
isElementIntersectingFrame(element, frame, elementsMap),
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const elementsAreInFrameBounds = (
|
|
||||||
elements: readonly ExcalidrawElement[],
|
|
||||||
frame: ExcalidrawFrameLikeElement,
|
|
||||||
elementsMap: ElementsMap,
|
|
||||||
) => {
|
|
||||||
const [frameX1, frameY1, frameX2, frameY2] = getElementAbsoluteCoords(
|
|
||||||
frame,
|
|
||||||
elementsMap,
|
|
||||||
);
|
|
||||||
|
|
||||||
const [elementX1, elementY1, elementX2, elementY2] =
|
|
||||||
getCommonBounds(elements);
|
|
||||||
|
|
||||||
return (
|
|
||||||
frameX1 <= elementX1 &&
|
|
||||||
frameY1 <= elementY1 &&
|
|
||||||
frameX2 >= elementX2 &&
|
|
||||||
frameY2 >= elementY2
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const elementOverlapsWithFrame = (
|
|
||||||
element: ExcalidrawElement,
|
|
||||||
frame: ExcalidrawFrameLikeElement,
|
|
||||||
elementsMap: ElementsMap,
|
|
||||||
) => {
|
|
||||||
return (
|
|
||||||
elementsAreInFrameBounds([element], frame, elementsMap) ||
|
|
||||||
isElementIntersectingFrame(element, frame, elementsMap) ||
|
|
||||||
isElementContainingFrame(element, frame, elementsMap)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isCursorInFrame = (
|
export const isCursorInFrame = (
|
||||||
cursorCoords: {
|
cursorCoords: {
|
||||||
x: number;
|
x: number;
|
|
@ -294,24 +294,6 @@ export const getSelectedGroupIdForElement = (
|
||||||
selectedGroupIds: { [groupId: string]: boolean },
|
selectedGroupIds: { [groupId: string]: boolean },
|
||||||
) => element.groupIds.find((groupId) => selectedGroupIds[groupId]);
|
) => element.groupIds.find((groupId) => selectedGroupIds[groupId]);
|
||||||
|
|
||||||
export const getNewGroupIdsForDuplication = (
|
|
||||||
groupIds: ExcalidrawElement["groupIds"],
|
|
||||||
editingGroupId: AppState["editingGroupId"],
|
|
||||||
mapper: (groupId: GroupId) => GroupId,
|
|
||||||
) => {
|
|
||||||
const copy = [...groupIds];
|
|
||||||
const positionOfEditingGroupId = editingGroupId
|
|
||||||
? groupIds.indexOf(editingGroupId)
|
|
||||||
: -1;
|
|
||||||
const endIndex =
|
|
||||||
positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;
|
|
||||||
for (let index = 0; index < endIndex; index++) {
|
|
||||||
copy[index] = mapper(copy[index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return copy;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const addToGroup = (
|
export const addToGroup = (
|
||||||
prevGroupIds: ExcalidrawElement["groupIds"],
|
prevGroupIds: ExcalidrawElement["groupIds"],
|
||||||
newGroupId: GroupId,
|
newGroupId: GroupId,
|
||||||
|
@ -377,24 +359,3 @@ export const getNonDeletedGroupIds = (elements: ElementsMap) => {
|
||||||
|
|
||||||
return nonDeletedGroupIds;
|
return nonDeletedGroupIds;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const elementsAreInSameGroup = (
|
|
||||||
elements: readonly ExcalidrawElement[],
|
|
||||||
) => {
|
|
||||||
const allGroups = elements.flatMap((element) => element.groupIds);
|
|
||||||
const groupCount = new Map<string, number>();
|
|
||||||
let maxGroup = 0;
|
|
||||||
|
|
||||||
for (const group of allGroups) {
|
|
||||||
groupCount.set(group, (groupCount.get(group) ?? 0) + 1);
|
|
||||||
if (groupCount.get(group)! > maxGroup) {
|
|
||||||
maxGroup = groupCount.get(group)!;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return maxGroup === elements.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isInGroup = (element: NonDeletedExcalidrawElement) => {
|
|
||||||
return element.groupIds.length > 0;
|
|
||||||
};
|
|
||||||
|
|
|
@ -1411,18 +1411,3 @@ export const isActiveToolNonLinearSnappable = (
|
||||||
activeToolType === TOOL_TYPE.text
|
activeToolType === TOOL_TYPE.text
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Rounding this point causes some shake when free drawing
|
|
||||||
export const getGridPoint = (
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
gridSize: NullableGridSize,
|
|
||||||
): [number, number] => {
|
|
||||||
if (gridSize) {
|
|
||||||
return [
|
|
||||||
Math.round(x / gridSize) * gridSize,
|
|
||||||
Math.round(y / gridSize) * gridSize,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return [x, y];
|
|
||||||
};
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue