b552c60714
* feat: Focus indicator Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Snapshot update Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * feat: Move visualdebug to utils and introduce volume bindable volume visualization Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Move visualdebug to elements Due to dep circles Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Possible test timeout Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Incorrect hit test point input Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * feat: Add fallback when dragged outside of allowed area Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Elbow arrows don't need focus point mgmt Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: End bound indirect fix Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Show indicator when arrow endpoint dragging Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Update bound arrow endpoint at mid-point drag Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * chore: Refactor Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Curve endpoint intersection Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Outline focus point is reset on existing arrow drag Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Tests Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * chore: Fix lint Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * feat: Dragging focus point off Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Don't show the focus indicator when arrow endpoint is dragged Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Drag area for focus handles Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Focus point size unified Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Size bump for focus knob Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * feat: Cache hits and scene lookups Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * chore: Remove debug Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Consider hit threshold and inside override too Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Other shape switching Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * perf: Update tolerance params Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Focus know line width Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: knob offset Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Full overlap Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * chore: Remove Map caching Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: incorrect threshold Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: threshold setting Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Hit caching Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: cache override Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Snapshots Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * feat: Redesigned focus point handling Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Inside-inside mode Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * chore: Remove comment Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * feat: Allow focus knob outside the shape Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Arrow endpoint offset Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Focus knob element distance Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Increase iteration on curve intersection calc Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Handle disabled binding Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Alt mode Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Nested shape focus rewrite Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Alt + Ctrl + arrow endpoitn Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Hit ordering for focus points Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Focus point visibility Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * dry out renderFocusPointIndicator * do not higlight point when dragging & make focus point smaller * optimize retrieval of selectedLinearElement * move focus highlighting into renderFocusPointIndicator to DRY out and colocate * remove `disabled` state from focus highlight * make focus point stroke color less prominent * fix: No focus point for multi-point arrows Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix: Arrow edit mode drag focus point release Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * DRY out arrow point-like drag * move `focus.ts` to `arrows/focus.ts` --------- Signed-off-by: Mark Tolmacs <mark@lazycat.hu> Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
102 lines
3.1 KiB
TypeScript
102 lines
3.1 KiB
TypeScript
import { toIterable } from "@excalidraw/common";
|
|
|
|
import { isInvisiblySmallElement } from "./sizeHelpers";
|
|
|
|
import type {
|
|
ExcalidrawElement,
|
|
NonDeletedExcalidrawElement,
|
|
NonDeleted,
|
|
ElementsMapOrArray,
|
|
} from "./types";
|
|
|
|
/**
|
|
* @deprecated unsafe, use hashElementsVersion instead
|
|
*/
|
|
export const getSceneVersion = (elements: readonly ExcalidrawElement[]) =>
|
|
elements.reduce((acc, el) => acc + el.version, 0);
|
|
|
|
/**
|
|
* Hashes elements' versionNonce (using djb2 algo). Order of elements matters.
|
|
*/
|
|
export const hashElementsVersion = (elements: ElementsMapOrArray): number => {
|
|
let hash = 5381;
|
|
for (const element of toIterable(elements)) {
|
|
hash = (hash << 5) + hash + element.versionNonce;
|
|
}
|
|
return hash >>> 0; // Ensure unsigned 32-bit integer
|
|
};
|
|
|
|
// string hash function (using djb2). Not cryptographically secure, use only
|
|
// for versioning and such.
|
|
// note: hashes individual code units (not code points),
|
|
// but for hashing purposes this is fine as it iterates through every code unit
|
|
// (as such, no need to encode to byte string first)
|
|
export const hashString = (s: string): number => {
|
|
let hash: number = 5381;
|
|
for (let i = 0; i < s.length; i++) {
|
|
const char: number = s.charCodeAt(i);
|
|
hash = (hash << 5) + hash + char;
|
|
}
|
|
return hash >>> 0; // Ensure unsigned 32-bit integer
|
|
};
|
|
|
|
export const getVisibleElements = (elements: readonly ExcalidrawElement[]) =>
|
|
elements.filter(
|
|
(el) => !el.isDeleted && !isInvisiblySmallElement(el),
|
|
) as readonly NonDeletedExcalidrawElement[];
|
|
|
|
export const getNonDeletedElements = <T extends ExcalidrawElement>(
|
|
elements: readonly T[],
|
|
) =>
|
|
elements.filter((element) => !element.isDeleted) as readonly NonDeleted<T>[];
|
|
|
|
export const isNonDeletedElement = <T extends ExcalidrawElement>(
|
|
element: T,
|
|
): element is NonDeleted<T> => !element.isDeleted;
|
|
|
|
export * from "./align";
|
|
export * from "./binding";
|
|
export * from "./bounds";
|
|
export * from "./collision";
|
|
export * from "./comparisons";
|
|
export * from "./containerCache";
|
|
export * from "./cropElement";
|
|
export * from "./delta";
|
|
export * from "./distance";
|
|
export * from "./distribute";
|
|
export * from "./dragElements";
|
|
export * from "./duplicate";
|
|
export * from "./elbowArrow";
|
|
export * from "./elementLink";
|
|
export * from "./embeddable";
|
|
export * from "./flowchart";
|
|
export * from "./arrows/focus";
|
|
export * from "./fractionalIndex";
|
|
export * from "./frame";
|
|
export * from "./groups";
|
|
export * from "./heading";
|
|
export * from "./image";
|
|
export * from "./linearElementEditor";
|
|
export * from "./mutateElement";
|
|
export * from "./newElement";
|
|
export * from "./positionElementsOnGrid";
|
|
export * from "./renderElement";
|
|
export * from "./resizeElements";
|
|
export * from "./resizeTest";
|
|
export * from "./Scene";
|
|
export * from "./selection";
|
|
export * from "./shape";
|
|
export * from "./showSelectedShapeActions";
|
|
export * from "./sizeHelpers";
|
|
export * from "./sortElements";
|
|
export * from "./store";
|
|
export * from "./textElement";
|
|
export * from "./textMeasurements";
|
|
export * from "./textWrapping";
|
|
export * from "./transform";
|
|
export * from "./transformHandles";
|
|
export * from "./typeChecks";
|
|
export * from "./utils";
|
|
export * from "./zindex";
|
|
export * from "./arrows/helpers";
|