make undo stroke in manual mode

This commit is contained in:
Sanster
2022-04-23 20:22:05 +08:00
parent f97e17a593
commit ce0c7defe1
2 changed files with 72 additions and 27 deletions

View File

@@ -94,20 +94,23 @@ export default function Editor(props: EditorProps) {
const [sliderPos, setSliderPos] = useState<number>(0)
const draw = (render: HTMLImageElement, lineGroup: LineGroup) => {
if (!context) {
return
}
context.clearRect(0, 0, context.canvas.width, context.canvas.height)
context.drawImage(
render,
0,
0,
original.naturalWidth,
original.naturalHeight
)
drawLines(context, lineGroup)
}
const draw = useCallback(
(render: HTMLImageElement, lineGroup: LineGroup) => {
if (!context) {
return
}
context.clearRect(0, 0, context.canvas.width, context.canvas.height)
context.drawImage(
render,
0,
0,
original.naturalWidth,
original.naturalHeight
)
drawLines(context, lineGroup)
},
[context, original]
)
const drawAllLinesOnMask = (_lineGroups: LineGroup[]) => {
if (!context?.canvas.width || !context?.canvas.height) {
@@ -167,13 +170,16 @@ export default function Editor(props: EditorProps) {
return renders.length !== 0
}
const drawOnCurrentRender = (lineGroup: LineGroup) => {
if (renders.length === 0) {
draw(original, lineGroup)
} else {
draw(renders[renders.length - 1], lineGroup)
}
}
const drawOnCurrentRender = useCallback(
(lineGroup: LineGroup) => {
if (renders.length === 0) {
draw(original, lineGroup)
} else {
draw(renders[renders.length - 1], lineGroup)
}
},
[original, renders, draw]
)
const clearDrawing = () => {
setIsDraging(false)
@@ -395,7 +401,16 @@ export default function Editor(props: EditorProps) {
drawOnCurrentRender(lineGroup)
}
const undo = () => {
const undoStroke = useCallback(() => {
if (curLineGroup.length === 0) {
return
}
const newLineGroup = curLineGroup.slice(0, curLineGroup.length - 1)
setCurLineGroup(newLineGroup)
drawOnCurrentRender(newLineGroup)
}, [curLineGroup, drawOnCurrentRender])
const undoRender = useCallback(() => {
if (!renders.length) {
return
}
@@ -411,6 +426,14 @@ export default function Editor(props: EditorProps) {
} else {
draw(newRenders[newRenders.length - 1], [])
}
}, [draw, renders, lineGroups, original])
const undo = () => {
if (settings.runInpaintingManually && curLineGroup.length !== 0) {
undoStroke()
} else {
undoRender()
}
}
// Handle Cmd+Z
@@ -427,7 +450,23 @@ export default function Editor(props: EditorProps) {
return false
}
useKey(undoPredicate, undo)
useKey(undoPredicate, undo, undefined, [undoStroke, undoRender])
const disableUndo = () => {
if (renders.length > 0) {
return false
}
if (settings.runInpaintingManually) {
if (curLineGroup.length === 0) {
return true
}
} else if (renders.length === 0) {
return true
}
return false
}
useKeyPressEvent(
'Tab',
@@ -661,7 +700,7 @@ export default function Editor(props: EditorProps) {
</svg>
}
onClick={undo}
disabled={renders.length === 0}
disabled={disableUndo()}
/>
<Button
icon={<EyeIcon />}