e5e07260c6
* fix: awkward point adding and removing on touch device * feat: move finalize to next to last point * feat: on touch screen, click would create a default line/arrow * fix: make default adaptive to zoom * fix: increase padding to avoid cutoffs * refactor: simplify * fix: only use bigger padding when needed * center arrow horizontally on pointer * increase min drag distance before we start 2-point-arrow-drag-creating * do not render 0-width arrow while creating * dead code * fix tests * fix: remove redundant code * do not enter line editor on creation --------- Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
78 lines
1.7 KiB
TypeScript
78 lines
1.7 KiB
TypeScript
import { throttleRAF } from "@excalidraw/common";
|
|
|
|
import { isInvisiblySmallElement, renderElement } from "@excalidraw/element";
|
|
|
|
import { bootstrapCanvas, getNormalizedCanvasDimensions } from "./helpers";
|
|
|
|
import type { NewElementSceneRenderConfig } from "../scene/types";
|
|
|
|
const _renderNewElementScene = ({
|
|
canvas,
|
|
rc,
|
|
newElement,
|
|
elementsMap,
|
|
allElementsMap,
|
|
scale,
|
|
appState,
|
|
renderConfig,
|
|
}: NewElementSceneRenderConfig) => {
|
|
if (canvas) {
|
|
const [normalizedWidth, normalizedHeight] = getNormalizedCanvasDimensions(
|
|
canvas,
|
|
scale,
|
|
);
|
|
|
|
const context = bootstrapCanvas({
|
|
canvas,
|
|
scale,
|
|
normalizedWidth,
|
|
normalizedHeight,
|
|
});
|
|
|
|
// Apply zoom
|
|
context.save();
|
|
context.scale(appState.zoom.value, appState.zoom.value);
|
|
|
|
if (newElement && newElement.type !== "selection") {
|
|
// e.g. when creating arrows and we're still below the arrow drag distance
|
|
// threshold
|
|
// (for now we skip render only with elements while we're creating to be
|
|
// safe)
|
|
if (isInvisiblySmallElement(newElement)) {
|
|
return;
|
|
}
|
|
|
|
renderElement(
|
|
newElement,
|
|
elementsMap,
|
|
allElementsMap,
|
|
rc,
|
|
context,
|
|
renderConfig,
|
|
appState,
|
|
);
|
|
} else {
|
|
context.clearRect(0, 0, normalizedWidth, normalizedHeight);
|
|
}
|
|
}
|
|
};
|
|
|
|
export const renderNewElementSceneThrottled = throttleRAF(
|
|
(config: NewElementSceneRenderConfig) => {
|
|
_renderNewElementScene(config);
|
|
},
|
|
{ trailing: true },
|
|
);
|
|
|
|
export const renderNewElementScene = (
|
|
renderConfig: NewElementSceneRenderConfig,
|
|
throttle?: boolean,
|
|
) => {
|
|
if (throttle) {
|
|
renderNewElementSceneThrottled(renderConfig);
|
|
return;
|
|
}
|
|
|
|
_renderNewElementScene(renderConfig);
|
|
};
|