From 9ac1da9fc1175fe093299a7cb8c90083c285f0ef Mon Sep 17 00:00:00 2001 From: L-Sun Date: Thu, 22 May 2025 03:54:31 +0000 Subject: [PATCH] fix(editor): should record edgeless connector mode (#12426) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close [BS-3355](https://linear.app/affine-design/issue/BS-3355/白板快捷键c没有记住上次用的connector形状) ## Summary by CodeRabbit - **New Features** - Added the ability to cycle through connector modes (Curve, Orthogonal, Straight) using the 'c' keyboard shortcut when the connector tool is active. - **Bug Fixes** - Improved the logic for remembering and restoring the last used connector mode when switching between tools. - **Tests** - Introduced a new end-to-end test to verify correct cycling and restoration of connector modes. --- .../root/src/edgeless/edgeless-keyboard.ts | 18 ++++++++--- .../gfx/connector/src/connector-tool.ts | 19 +++++++++--- .../e2e/edgeless/connector/connector.spec.ts | 31 ++++++++++++++++++- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts b/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts index 56c1471b39..bb43c4c72a 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts +++ b/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts @@ -31,7 +31,7 @@ import { mountShapeTextEditor, ShapeTool } from '@blocksuite/affine-gfx-shape'; import { TextTool } from '@blocksuite/affine-gfx-text'; import { ConnectorElementModel, - ConnectorMode, + type ConnectorMode, EdgelessTextBlockModel, GroupElementModel, LayoutType, @@ -93,10 +93,18 @@ export class EdgelessPageKeyboardManager extends PageKeyboardManager { this._setEdgelessTool(TextTool); }, c: () => { - const mode = ConnectorMode.Curve; - rootComponent.std.get(EditPropsStore).recordLastProps('connector', { - mode, - }); + const editPropsStore = this.std.get(EditPropsStore); + + let mode: ConnectorMode; + if ( + this.gfx.tool.currentToolName$.peek() === ConnectorTool.toolName + ) { + mode = this.gfx.tool.get(ConnectorTool).getNextMode(); + editPropsStore.recordLastProps('connector', { mode }); + } else { + mode = editPropsStore.lastProps$.peek().connector.mode; + } + this._setEdgelessTool(ConnectorTool, { mode }); }, h: () => { diff --git a/blocksuite/affine/gfx/connector/src/connector-tool.ts b/blocksuite/affine/gfx/connector/src/connector-tool.ts index e520c139a8..fe04313fe3 100644 --- a/blocksuite/affine/gfx/connector/src/connector-tool.ts +++ b/blocksuite/affine/gfx/connector/src/connector-tool.ts @@ -3,12 +3,10 @@ import { DefaultTool, OverlayIdentifier, } from '@blocksuite/affine-block-surface'; -import type { - Connection, - ConnectorElementModel, - ConnectorMode, -} from '@blocksuite/affine-model'; import { + type Connection, + type ConnectorElementModel, + ConnectorMode, GroupElementModel, ShapeElementModel, ShapeType, @@ -223,4 +221,15 @@ export class ConnectorTool extends BaseTool { this.findTargetByPoint(point); } + + getNextMode() { + switch (this.activatedOption.mode) { + case ConnectorMode.Curve: + return ConnectorMode.Orthogonal; + case ConnectorMode.Orthogonal: + return ConnectorMode.Straight; + case ConnectorMode.Straight: + return ConnectorMode.Curve; + } + } } diff --git a/tests/blocksuite/e2e/edgeless/connector/connector.spec.ts b/tests/blocksuite/e2e/edgeless/connector/connector.spec.ts index f36f030ccb..c9f29df90e 100644 --- a/tests/blocksuite/e2e/edgeless/connector/connector.spec.ts +++ b/tests/blocksuite/e2e/edgeless/connector/connector.spec.ts @@ -2,15 +2,18 @@ import { expect } from '@playwright/test'; import { addBasicConnectorElement, + assertEdgelessConnectorToolMode, changeConnectorStrokeColor, changeConnectorStrokeStyle, changeConnectorStrokeWidth, + ConnectorMode, createConnectorElement, createShapeElement, dragBetweenViewCoords, edgelessCommonSetup as commonSetup, getConnectorPath, getConnectorPathWithInOut, + locatorComponentToolbar, pickColorAtPoints, rotateElementByHandle, selectElementInEdgeless, @@ -21,7 +24,11 @@ import { triggerComponentToolbarAction, triggerShapeSwitch, } from '../../utils/actions/edgeless.js'; -import { pressBackspace, waitNextFrame } from '../../utils/actions/index.js'; +import { + clickView, + pressBackspace, + waitNextFrame, +} from '../../utils/actions/index.js'; import { assertConnectorPath, assertEdgelessNonSelectedRect, @@ -186,6 +193,28 @@ test('change connector stroke style', async ({ page }) => { expect(pickedColor[0]).toBe('#000000'); }); +test('should record previous connector mode', async ({ page }) => { + await commonSetup(page); + await setEdgelessTool(page, 'connector'); + await assertEdgelessConnectorToolMode(page, ConnectorMode.Curve); + await page.keyboard.press('c'); + await assertEdgelessConnectorToolMode(page, ConnectorMode.Orthogonal); + await page.keyboard.press('c'); + await assertEdgelessConnectorToolMode(page, ConnectorMode.Straight); + + await dragBetweenViewCoords(page, [100, 100], [200, 200]); + await page.keyboard.press('c'); + await assertEdgelessConnectorToolMode(page, ConnectorMode.Straight); + + await setEdgelessTool(page, 'default'); + await clickView(page, [150, 150]); + await triggerComponentToolbarAction(page, 'changeConnectorShape'); + await locatorComponentToolbar(page).getByLabel('Curve').click(); + + await page.keyboard.press('c'); + await assertEdgelessConnectorToolMode(page, ConnectorMode.Curve); +}); + test.describe('quick connect', () => { test('should create a connector when clicking on button', async ({ page,