From 60e974c6091b8f3de53ca77f7895f7097e350e22 Mon Sep 17 00:00:00 2001 From: KennyLewi Date: Fri, 10 Apr 2026 16:53:59 +0800 Subject: [PATCH] feat: add shortcuts for edge polarities --- client/src/controllers/command.ts | 9 +++++++++ client/src/controllers/keyboard.ts | 19 ++++++++++++++---- client/src/views/help/HelpModalView.tsx | 26 ++++++++++++++----------- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/client/src/controllers/command.ts b/client/src/controllers/command.ts index b24bd89..454b84e 100644 --- a/client/src/controllers/command.ts +++ b/client/src/controllers/command.ts @@ -5,6 +5,7 @@ import { deleteLoop, deleteNode, deleteStock, + updateEdge, } from "@/actions/graph"; import { isCloudId, isEdgeId, isFlowId, isLoopId, isNodeId, isStockId } from "@/models/graph"; import { useInteractionStore } from "@/stores/interaction"; @@ -24,9 +25,17 @@ export function useCommands() { clearSelectedIds(); }; + const updateEdgePolarities = (ids: string[], patch: Partial<{ polarity: "+" | "-" }>) => { + ids.forEach((id) => { + if (isEdgeId(id)) updateEdge(id, patch); + }); + }; + return { deleteSelectedIds: () => deleteIds(selectedIds), deleteId: (id: string) => deleteIds([id]), + updateSelectedEdgePolarities: (polarity: "+" | "-") => + updateEdgePolarities(selectedIds, { polarity }), cancelSelection: () => clearSelectedIds(), }; } diff --git a/client/src/controllers/keyboard.ts b/client/src/controllers/keyboard.ts index 329fa8d..ceace18 100644 --- a/client/src/controllers/keyboard.ts +++ b/client/src/controllers/keyboard.ts @@ -1,12 +1,11 @@ import { useEffect } from "react"; +import { useCommands } from "@/controllers/command"; import { useInteractionStore } from "@/stores/interaction"; -import { useCommands } from "./command"; - export function useKeyboardShortcuts() { const { setInteractionMode, toggleInspectorOpen } = useInteractionStore(); - const { deleteSelectedIds, cancelSelection } = useCommands(); + const { deleteSelectedIds, cancelSelection, updateSelectedEdgePolarities } = useCommands(); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { @@ -33,6 +32,12 @@ export function useKeyboardShortcuts() { cancelSelection(); setInteractionMode("select"); break; + case "+": + updateSelectedEdgePolarities("+"); + break; + case "-": + updateSelectedEdgePolarities("-"); + break; case "Backspace": case "Delete": deleteSelectedIds(); @@ -42,5 +47,11 @@ export function useKeyboardShortcuts() { window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); - }, [deleteSelectedIds, cancelSelection, setInteractionMode, toggleInspectorOpen]); + }, [ + deleteSelectedIds, + cancelSelection, + updateSelectedEdgePolarities, + setInteractionMode, + toggleInspectorOpen, + ]); } diff --git a/client/src/views/help/HelpModalView.tsx b/client/src/views/help/HelpModalView.tsx index 6790a5a..5e21ea6 100644 --- a/client/src/views/help/HelpModalView.tsx +++ b/client/src/views/help/HelpModalView.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { Fragment, useState } from "react"; import { LuCircleHelp } from "react-icons/lu"; import { Button } from "@/components/ui/button"; @@ -14,9 +14,11 @@ export function HelpModalView() { const [isOpen, setIsOpen] = useState(false); const shortcuts = [ - { keys: ["Ctrl", "\\"], description: "Toggle Inspector Sidebar" }, + { keys: ["Ctrl / ⌘", "\\"], description: "Toggle Inspector Sidebar" }, + { keys: ["+"], description: "Set Selected Edges' Polarity to Positive" }, + { keys: ["-"], description: "Set Selected Edges' Polarity to Negative" }, { keys: ["Esc"], description: "Clear Selection & Select Mode" }, - { keys: ["Del"], description: "Delete Selected Items" }, + { keys: ["Del / ⌫"], description: "Delete Selected Items" }, ]; return ( @@ -45,14 +47,16 @@ export function HelpModalView() { {s.description} -
- {s.keys.map((key) => ( - - {key === "\\" ? " \u005C " : key} - +
+ {s.keys.map((key, index) => ( + + + {key === "\\" ? "\u005C" : key} + + {index < s.keys.length - 1 && ( + + + )} + ))}