From df988e83f60a886b623202505c9a02e907851a84 Mon Sep 17 00:00:00 2001 From: Ryan Di Date: Thu, 20 Mar 2025 20:30:33 +1100 Subject: [PATCH] keep lasso if selected from toolbar --- packages/excalidraw/actions/actionCanvas.tsx | 1 + packages/excalidraw/appState.ts | 1 + packages/excalidraw/components/App.tsx | 12 +++++++++--- packages/excalidraw/types.ts | 2 ++ packages/excalidraw/utils.ts | 3 ++- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/excalidraw/actions/actionCanvas.tsx b/packages/excalidraw/actions/actionCanvas.tsx index f261ab947..642c58b1f 100644 --- a/packages/excalidraw/actions/actionCanvas.tsx +++ b/packages/excalidraw/actions/actionCanvas.tsx @@ -532,6 +532,7 @@ export const actionToggleLassoTool = register({ if (appState.activeTool.type !== "lasso") { activeTool = updateActiveTool(appState, { type: "lasso", + fromSelection: false, }); setCursor(app.interactiveCanvas, CURSOR_TYPE.CROSSHAIR); } else { diff --git a/packages/excalidraw/appState.ts b/packages/excalidraw/appState.ts index c56ba9acb..2cb4eadb1 100644 --- a/packages/excalidraw/appState.ts +++ b/packages/excalidraw/appState.ts @@ -52,6 +52,7 @@ export const getDefaultAppState = (): Omit< type: "selection", customType: null, locked: DEFAULT_ELEMENT_PROPS.locked, + fromSelection: false, lastActiveTool: null, }, penMode: false, diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 01af409c5..d79f3de45 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -4696,7 +4696,7 @@ class App extends React.Component { } ) | { type: "custom"; customType: string } - ) & { locked?: boolean }, + ) & { locked?: boolean; fromSelection?: boolean }, ) => { if (!this.isToolSupported(tool.type)) { console.warn( @@ -8592,7 +8592,7 @@ class App extends React.Component { pointerDownState.lastCoords.x = pointerCoords.x; pointerDownState.lastCoords.y = pointerCoords.y; if (event.altKey) { - this.setActiveTool({ type: "lasso" }); + this.setActiveTool({ type: "lasso", fromSelection: true }); this.lassoTrail.startPath(pointerCoords.x, pointerCoords.y); this.setAppState({ selectionElement: null, @@ -9684,7 +9684,13 @@ class App extends React.Component { return; } - if (!activeTool.locked && activeTool.type !== "freedraw") { + if ( + !activeTool.locked && + activeTool.type !== "freedraw" && + // if lasso is turned on but from selection => reset to selection + activeTool.type === "lasso" && + activeTool.fromSelection + ) { resetCursor(this.interactiveCanvas); this.setState({ newElement: null, diff --git a/packages/excalidraw/types.ts b/packages/excalidraw/types.ts index 0462658c9..91ab5c636 100644 --- a/packages/excalidraw/types.ts +++ b/packages/excalidraw/types.ts @@ -300,6 +300,8 @@ export interface AppState { */ lastActiveTool: ActiveTool | null; locked: boolean; + // indicates if the current tool is temporarily switched on from the selection tool + fromSelection: boolean; } & ActiveTool; penMode: boolean; penDetected: boolean; diff --git a/packages/excalidraw/utils.ts b/packages/excalidraw/utils.ts index 84f6637f1..76029c260 100644 --- a/packages/excalidraw/utils.ts +++ b/packages/excalidraw/utils.ts @@ -382,7 +382,7 @@ export const updateActiveTool = ( type: ToolType; } | { type: "custom"; customType: string } - ) & { locked?: boolean }) & { + ) & { locked?: boolean; fromSelection?: boolean }) & { lastActiveToolBeforeEraser?: ActiveTool | null; }, ): AppState["activeTool"] => { @@ -404,6 +404,7 @@ export const updateActiveTool = ( type: data.type, customType: null, locked: data.locked ?? appState.activeTool.locked, + fromSelection: data.fromSelection ?? false, }; };