diff --git a/src/components/EditorCanvas/Area.jsx b/src/components/EditorCanvas/Area.jsx index 490c0c7..eb47ce0 100644 --- a/src/components/EditorCanvas/Area.jsx +++ b/src/components/EditorCanvas/Area.jsx @@ -1,6 +1,11 @@ import { useMemo, useRef, useState } from "react"; import { Button, Popover, Input, ColorPicker } from "@douyinfe/semi-ui"; -import { IconEdit, IconDeleteStroked } from "@douyinfe/semi-icons"; +import { + IconEdit, + IconDeleteStroked, + IconLock, + IconUnlock, +} from "@douyinfe/semi-icons"; import { Tab, Action, ObjectType, State } from "../../data/constants"; import { useCanvas, @@ -30,6 +35,7 @@ export default function Area({ const { layout } = useLayout(); const { settings } = useSettings(); const { setSaveState } = useSaveState(); + const { updateArea } = useAreas(); const { selectedElement, setSelectedElement, bulkSelectedElements } = useSelect(); @@ -45,6 +51,10 @@ export default function Area({ }); }; + const lockUnlockArea = () => { + updateArea(data.id, { locked: !data.locked }); + }; + const edit = () => { if (layout.sidebar) { setSelectedElement((prev) => ({ @@ -123,25 +133,36 @@ export default function Area({ {data.name} {(isHovered || (areaIsOpen() && !layout.sidebar)) && ( - } - trigger="custom" - position="rightTop" - showArrow - > +
)} diff --git a/src/components/EditorCanvas/Canvas.jsx b/src/components/EditorCanvas/Canvas.jsx index b5df796..4fb5234 100644 --- a/src/components/EditorCanvas/Canvas.jsx +++ b/src/components/EditorCanvas/Canvas.jsx @@ -126,6 +126,8 @@ export default function Canvas() { }); areas.forEach((area) => { + if (area.locked) return; + if ( isInsideRect( { @@ -145,6 +147,8 @@ export default function Canvas() { }); notes.forEach((note) => { + if (note.locked) return; + if ( isInsideRect( { @@ -333,11 +337,17 @@ export default function Canvas() { dragging.id !== null && areaResize.id === -1 ) { + const area = areas.find((t) => t.id === dragging.id); + if (area.locked) return; + updateArea(dragging.id, { x: pointer.spaces.diagram.x + grabOffset.x, y: pointer.spaces.diagram.y + grabOffset.y, }); } else if (dragging.element === ObjectType.NOTE && dragging.id !== null) { + const note = notes.find((t) => t.id === dragging.id); + if (note.locked) return; + updateNote(dragging.id, { x: pointer.spaces.diagram.x + grabOffset.x, y: pointer.spaces.diagram.y + grabOffset.y, diff --git a/src/components/EditorCanvas/Note.jsx b/src/components/EditorCanvas/Note.jsx index 99a91ba..4703377 100644 --- a/src/components/EditorCanvas/Note.jsx +++ b/src/components/EditorCanvas/Note.jsx @@ -1,7 +1,12 @@ import { useMemo, useState } from "react"; import { Action, ObjectType, Tab, State } from "../../data/constants"; import { Input, Button, Popover, ColorPicker } from "@douyinfe/semi-ui"; -import { IconEdit, IconDeleteStroked } from "@douyinfe/semi-icons"; +import { + IconEdit, + IconDeleteStroked, + IconLock, + IconUnlock, +} from "@douyinfe/semi-icons"; import { useLayout, useUndoRedo, @@ -56,6 +61,10 @@ export default function Note({ data, onPointerDown }) { setRedoStack([]); }; + const lockUnlockNote = () => { + updateNote(data.id, { locked: !data.locked }); + }; + const edit = () => { setSelectedElement((prev) => ({ ...prev, @@ -152,7 +161,16 @@ export default function Note({ data, onPointerDown }) { selectedElement.id === data.id && selectedElement.open && !layout.sidebar)) && ( -
+
+