From aa873234ad2d3f55ef36e1a1060f54cf643d8e7e Mon Sep 17 00:00:00 2001 From: Marcel Mraz Date: Fri, 14 Mar 2025 16:35:29 +0100 Subject: [PATCH] Separate more things --- packages/{excalidraw => common}/binaryheap.ts | 0 packages/{excalidraw => common}/keys.test.ts | 0 packages/{excalidraw => common}/keys.ts | 2 +- packages/{excalidraw => common}/points.ts | 0 packages/{excalidraw => common}/random.ts | 0 .../{excalidraw/data => common}/url.test.tsx | 0 packages/{excalidraw/data => common}/url.ts | 2 +- packages/common/utils.ts | 57 +++++++++++++++++ packages/{excalidraw => element}/frame.ts | 63 ++----------------- packages/excalidraw/groups.ts | 39 ------------ packages/excalidraw/snapping.ts | 15 ----- 11 files changed, 64 insertions(+), 114 deletions(-) rename packages/{excalidraw => common}/binaryheap.ts (100%) rename packages/{excalidraw => common}/keys.test.ts (100%) rename packages/{excalidraw => common}/keys.ts (98%) rename packages/{excalidraw => common}/points.ts (100%) rename packages/{excalidraw => common}/random.ts (100%) rename packages/{excalidraw/data => common}/url.test.tsx (100%) rename packages/{excalidraw/data => common}/url.ts (94%) rename packages/{excalidraw => element}/frame.ts (94%) diff --git a/packages/excalidraw/binaryheap.ts b/packages/common/binaryheap.ts similarity index 100% rename from packages/excalidraw/binaryheap.ts rename to packages/common/binaryheap.ts diff --git a/packages/excalidraw/keys.test.ts b/packages/common/keys.test.ts similarity index 100% rename from packages/excalidraw/keys.test.ts rename to packages/common/keys.test.ts diff --git a/packages/excalidraw/keys.ts b/packages/common/keys.ts similarity index 98% rename from packages/excalidraw/keys.ts rename to packages/common/keys.ts index 948e7f568..4e018253a 100644 --- a/packages/excalidraw/keys.ts +++ b/packages/common/keys.ts @@ -1,6 +1,6 @@ import { isDarwin } from "./constants"; -import type { ValueOf } from "./utility-types"; +import type { ValueOf } from "../excalidraw/utility-types"; export const CODES = { EQUAL: "Equal", diff --git a/packages/excalidraw/points.ts b/packages/common/points.ts similarity index 100% rename from packages/excalidraw/points.ts rename to packages/common/points.ts diff --git a/packages/excalidraw/random.ts b/packages/common/random.ts similarity index 100% rename from packages/excalidraw/random.ts rename to packages/common/random.ts diff --git a/packages/excalidraw/data/url.test.tsx b/packages/common/url.test.tsx similarity index 100% rename from packages/excalidraw/data/url.test.tsx rename to packages/common/url.test.tsx diff --git a/packages/excalidraw/data/url.ts b/packages/common/url.ts similarity index 94% rename from packages/excalidraw/data/url.ts rename to packages/common/url.ts index a758d233e..eaa89633a 100644 --- a/packages/excalidraw/data/url.ts +++ b/packages/common/url.ts @@ -1,6 +1,6 @@ import { sanitizeUrl } from "@braintree/sanitize-url"; -import { escapeDoubleQuotes } from "../utils"; +import { escapeDoubleQuotes } from "./utils"; export const normalizeLink = (link: string) => { link = link.trim(); diff --git a/packages/common/utils.ts b/packages/common/utils.ts index 6b3580754..7b3b2e804 100644 --- a/packages/common/utils.ts +++ b/packages/common/utils.ts @@ -1245,3 +1245,60 @@ export const escapeDoubleQuotes = (str: string) => { export const castArray = (value: T | T[]): T[] => 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(); + 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; +}; diff --git a/packages/excalidraw/frame.ts b/packages/element/frame.ts similarity index 94% rename from packages/excalidraw/frame.ts rename to packages/element/frame.ts index 758bc273e..448ea239e 100644 --- a/packages/excalidraw/frame.ts +++ b/packages/element/frame.ts @@ -16,8 +16,8 @@ import { getContainerElement, } from "./element/textElement"; import { isFrameElement, isFrameLikeElement } from "./element/typeChecks"; -import { getElementsInGroup, selectGroupsFromGivenElements } from "./groups"; -import { getElementsWithinSelection, getSelectedElements } from "./scene"; +import { getElementsInGroup, selectGroupsFromGivenElements } from "../excalidraw/groups"; +import { getElementsWithinSelection, getSelectedElements } from "../excalidraw/scene"; import { arrayToMap } from "./utils"; import type { @@ -28,13 +28,13 @@ import type { NonDeleted, NonDeletedExcalidrawElement, } from "./element/types"; -import type { ExcalidrawElementsIncludingDeleted } from "./scene/Scene"; +import type { ExcalidrawElementsIncludingDeleted } from "../excalidraw/scene/Scene"; import type { AppClassProperties, AppState, StaticCanvasAppState, -} from "./types"; -import type { ReadonlySetLike } from "./utility-types"; +} from "../excalidraw/types"; +import type { ReadonlySetLike } from "../excalidraw/utility-types"; // --------------------------- Frame State ------------------------------------ export const bindElementsToFramesAfterDuplication = ( @@ -99,59 +99,6 @@ export const getElementsCompletelyInFrame = ( 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 = ( cursorCoords: { x: number; diff --git a/packages/excalidraw/groups.ts b/packages/excalidraw/groups.ts index cedc4af0f..a81990832 100644 --- a/packages/excalidraw/groups.ts +++ b/packages/excalidraw/groups.ts @@ -294,24 +294,6 @@ export const getSelectedGroupIdForElement = ( selectedGroupIds: { [groupId: string]: boolean }, ) => 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 = ( prevGroupIds: ExcalidrawElement["groupIds"], newGroupId: GroupId, @@ -377,24 +359,3 @@ export const getNonDeletedGroupIds = (elements: ElementsMap) => { return nonDeletedGroupIds; }; - -export const elementsAreInSameGroup = ( - elements: readonly ExcalidrawElement[], -) => { - const allGroups = elements.flatMap((element) => element.groupIds); - const groupCount = new Map(); - 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; -}; diff --git a/packages/excalidraw/snapping.ts b/packages/excalidraw/snapping.ts index 7c85f4112..f090f03f8 100644 --- a/packages/excalidraw/snapping.ts +++ b/packages/excalidraw/snapping.ts @@ -1411,18 +1411,3 @@ export const isActiveToolNonLinearSnappable = ( 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]; -};