mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat(erase-object): add freeform lasso selection mode (#503)
Adds a Brush | Lasso toggle to the object eraser. Lasso lets the user drag a freeform loop that auto-closes and fills into the mask, so they select around a subject instead of painting every pixel. Frontend-only; the mask contract is unchanged. Also un-skips the erase-object e2e suite via a shared mockAiFeaturesInstalled helper (7 tests now run; 2 multi-file tests fixme'd for a pre-existing tool-page remount bug). Closes #492.
This commit is contained in:
@@ -361,6 +361,7 @@ export function ToolPage() {
|
||||
const eraserRef = useRef<EraserCanvasRef | null>(null);
|
||||
const [eraserHasStrokes, setEraserHasStrokes] = useState(false);
|
||||
const [eraserBrushSize, setEraserBrushSize] = useState(30);
|
||||
const [eraserMode, setEraserMode] = useState<"brush" | "lasso">("brush");
|
||||
const [eraserMaskedCount, setEraserMaskedCount] = useState(0);
|
||||
// Center of the painted mask as a 0-100 percentage, used to init the slider at the erased spot
|
||||
const [eraserSliderInitPos, setEraserSliderInitPos] = useState<number | null>(null);
|
||||
@@ -660,6 +661,8 @@ export function ToolPage() {
|
||||
hasStrokes: eraserHasStrokes,
|
||||
brushSize: eraserBrushSize,
|
||||
onBrushSizeChange: setEraserBrushSize,
|
||||
mode: eraserMode,
|
||||
onModeChange: setEraserMode,
|
||||
onMaskCenter: setEraserSliderInitPos,
|
||||
maskedFileCount: eraserMaskedCount,
|
||||
}
|
||||
@@ -851,6 +854,7 @@ export function ToolPage() {
|
||||
ref={eraserRef}
|
||||
imageSrc={originalBlobUrl}
|
||||
brushSize={eraserBrushSize}
|
||||
mode={eraserMode}
|
||||
onStrokeChange={setEraserHasStrokes}
|
||||
onMaskedCountChange={setEraserMaskedCount}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user