|
@@ -111,7 +111,6 @@ import {
|
|
|
import { LinearElementEditor } from "../element/linearElementEditor";
|
|
|
import { mutateElement } from "../element/mutateElement";
|
|
|
import { deepCopyElement, newFreeDrawElement } from "../element/newElement";
|
|
|
-import { MaybeTransformHandleType } from "../element/transformHandles";
|
|
|
import {
|
|
|
isBindingElement,
|
|
|
isBindingElementType,
|
|
@@ -167,9 +166,11 @@ import { findShapeByKey } from "../shapes";
|
|
|
import {
|
|
|
AppProps,
|
|
|
AppState,
|
|
|
+ ExcalidrawImperativeAPI,
|
|
|
Gesture,
|
|
|
GestureEvent,
|
|
|
LibraryItems,
|
|
|
+ PointerDownState,
|
|
|
SceneData,
|
|
|
} from "../types";
|
|
|
import {
|
|
@@ -180,7 +181,6 @@ import {
|
|
|
isToolIcon,
|
|
|
isWritableElement,
|
|
|
resetCursor,
|
|
|
- ResolvablePromise,
|
|
|
resolvablePromise,
|
|
|
sceneCoordsToViewportCoords,
|
|
|
setCursor,
|
|
@@ -222,83 +222,6 @@ const gesture: Gesture = {
|
|
|
initialScale: null,
|
|
|
};
|
|
|
|
|
|
-export type PointerDownState = Readonly<{
|
|
|
- // The first position at which pointerDown happened
|
|
|
- origin: Readonly<{ x: number; y: number }>;
|
|
|
- // Same as "origin" but snapped to the grid, if grid is on
|
|
|
- originInGrid: Readonly<{ x: number; y: number }>;
|
|
|
- // Scrollbar checks
|
|
|
- scrollbars: ReturnType<typeof isOverScrollBars>;
|
|
|
- // The previous pointer position
|
|
|
- lastCoords: { x: number; y: number };
|
|
|
- // map of original elements data
|
|
|
- originalElements: Map<string, NonDeleted<ExcalidrawElement>>;
|
|
|
- resize: {
|
|
|
- // Handle when resizing, might change during the pointer interaction
|
|
|
- handleType: MaybeTransformHandleType;
|
|
|
- // This is determined on the initial pointer down event
|
|
|
- isResizing: boolean;
|
|
|
- // This is determined on the initial pointer down event
|
|
|
- offset: { x: number; y: number };
|
|
|
- // This is determined on the initial pointer down event
|
|
|
- arrowDirection: "origin" | "end";
|
|
|
- // This is a center point of selected elements determined on the initial pointer down event (for rotation only)
|
|
|
- center: { x: number; y: number };
|
|
|
- };
|
|
|
- hit: {
|
|
|
- // The element the pointer is "hitting", is determined on the initial
|
|
|
- // pointer down event
|
|
|
- element: NonDeleted<ExcalidrawElement> | null;
|
|
|
- // The elements the pointer is "hitting", is determined on the initial
|
|
|
- // pointer down event
|
|
|
- allHitElements: NonDeleted<ExcalidrawElement>[];
|
|
|
- // This is determined on the initial pointer down event
|
|
|
- wasAddedToSelection: boolean;
|
|
|
- // Whether selected element(s) were duplicated, might change during the
|
|
|
- // pointer interaction
|
|
|
- hasBeenDuplicated: boolean;
|
|
|
- hasHitCommonBoundingBoxOfSelectedElements: boolean;
|
|
|
- };
|
|
|
- withCmdOrCtrl: boolean;
|
|
|
- drag: {
|
|
|
- // Might change during the pointer interation
|
|
|
- hasOccurred: boolean;
|
|
|
- // Might change during the pointer interation
|
|
|
- offset: { x: number; y: number } | null;
|
|
|
- };
|
|
|
- // We need to have these in the state so that we can unsubscribe them
|
|
|
- eventListeners: {
|
|
|
- // It's defined on the initial pointer down event
|
|
|
- onMove: null | ((event: PointerEvent) => void);
|
|
|
- // It's defined on the initial pointer down event
|
|
|
- onUp: null | ((event: PointerEvent) => void);
|
|
|
- // It's defined on the initial pointer down event
|
|
|
- onKeyDown: null | ((event: KeyboardEvent) => void);
|
|
|
- // It's defined on the initial pointer down event
|
|
|
- onKeyUp: null | ((event: KeyboardEvent) => void);
|
|
|
- };
|
|
|
-}>;
|
|
|
-
|
|
|
-export type ExcalidrawImperativeAPI = {
|
|
|
- updateScene: InstanceType<typeof App>["updateScene"];
|
|
|
- resetScene: InstanceType<typeof App>["resetScene"];
|
|
|
- getSceneElementsIncludingDeleted: InstanceType<
|
|
|
- typeof App
|
|
|
- >["getSceneElementsIncludingDeleted"];
|
|
|
- history: {
|
|
|
- clear: InstanceType<typeof App>["resetHistory"];
|
|
|
- };
|
|
|
- scrollToContent: InstanceType<typeof App>["scrollToContent"];
|
|
|
- getSceneElements: InstanceType<typeof App>["getSceneElements"];
|
|
|
- getAppState: () => InstanceType<typeof App>["state"];
|
|
|
- refresh: InstanceType<typeof App>["refresh"];
|
|
|
- importLibrary: InstanceType<typeof App>["importLibraryFromUrl"];
|
|
|
- setToastMessage: InstanceType<typeof App>["setToastMessage"];
|
|
|
- readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;
|
|
|
- ready: true;
|
|
|
- id: string;
|
|
|
-};
|
|
|
-
|
|
|
class App extends React.Component<AppProps, AppState> {
|
|
|
canvas: HTMLCanvasElement | null = null;
|
|
|
rc: RoughCanvas | null = null;
|